/*!
 * UEditor
 * version: ueditor
 * build: Wed Aug 10 2016 11:06:03 GMT+0800 (CST)
 */

!
  function() {
    function getListener(a, b, c) {
      var d;
      return b = b.toLowerCase(),
      (d = a.__allListeners || c && (a.__allListeners = {})) && (d[b] || c && (d[b] = []))
    }
    function getDomNode(a, b, c, d, e, f) {
      var g, h = d && a[b];
      for (!h && (h = a[c]); ! h && (g = (g || a).parentNode);) {
        if ("BODY" == g.tagName || f && !f(g)) return null;
        h = g[c]
      }
      return h && e && !e(h) ? getDomNode(h, b, c, !1, e) : h
    }
    UEDITOR_CONFIG = window.UEDITOR_CONFIG || {};
    var baidu = window.baidu || {};
    window.baidu = baidu,
      window.UE = baidu.editor = window.UE || {},
      UE.plugins = {},
      UE.commands = {},
      UE.instants = {},
      UE.I18N = {},
      UE._customizeUI = {},
      UE.version = "1.4.3";
    var dom = UE.dom = {},
      browser = UE.browser = function() {
        var a = navigator.userAgent.toLowerCase(),
          b = window.opera,
          c = {
            ie: /(msie\s|trident.*rv:)([\w.]+)/.test(a),
            opera: !!b && b.version,
            webkit: a.indexOf(" applewebkit/") > -1,
            mac: a.indexOf("macintosh") > -1,
            quirks: "BackCompat" == document.compatMode
          };
        c.gecko = "Gecko" == navigator.product && !c.webkit && !c.opera && !c.ie;
        var d = 0;
        if (c.ie) {
          var e = a.match(/(?:msie\s([\w.]+))/),
            f = a.match(/(?:trident.*rv:([\w.]+))/);
          d = e && f && e[1] && f[1] ? Math.max(1 * e[1], 1 * f[1]) : e && e[1] ? 1 * e[1] : f && f[1] ? 1 * f[1] : 0,
            c.ie11Compat = 11 == document.documentMode,
            c.ie9Compat = 9 == document.documentMode,
            c.ie8 = !!document.documentMode,
            c.ie8Compat = 8 == document.documentMode,
            c.ie7Compat = 7 == d && !document.documentMode || 7 == document.documentMode,
            c.ie6Compat = d < 7 || c.quirks,
            c.ie9above = d > 8,
            c.ie9below = d < 9,
            c.ie11above = d > 10,
            c.ie11below = d < 11
        }
        if (c.gecko) {
          var g = a.match(/rv:([\d\.]+)/);
          g && (g = g[1].split("."), d = 1e4 * g[0] + 100 * (g[1] || 0) + 1 * (g[2] || 0))
        }
        return /chrome\/(\d+\.\d)/i.test(a) && (c.chrome = +RegExp.$1),
        /(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(a) && !/chrome/i.test(a) && (c.safari = +(RegExp.$1 || RegExp.$2)),
        c.opera && (d = parseFloat(b.version())),
        c.webkit && (d = parseFloat(a.match(/ applewebkit\/(\d+)/)[1])),
          c.version = d,
          c.isCompatible = !c.mobile && (c.ie && d >= 6 || c.gecko && d >= 10801 || c.opera && d >= 9.5 || c.air && d >= 1 || c.webkit && d >= 522 || !1),
          c
      } (),
      ie = browser.ie,
      webkit = browser.webkit,
      gecko = browser.gecko,
      opera = browser.opera,
      utils = UE.utils = {
        each: function(a, b, c) {
          if (null != a) if (a.length === +a.length) {
            for (var d = 0,
                   e = a.length; d < e; d++) if (b.call(c, a[d], d, a) === !1) return ! 1
          } else for (var f in a) if (a.hasOwnProperty(f) && b.call(c, a[f], f, a) === !1) return ! 1
        },
        makeInstance: function(a) {
          var b = new Function;
          return b.prototype = a,
            a = new b,
            b.prototype = null,
            a
        },
        extend: function(a, b, c) {
          if (b) for (var d in b) c && a.hasOwnProperty(d) || (a[d] = b[d]);
          return a
        },
        extend2: function(a) {
          for (var b = arguments,
                 c = 1; c < b.length; c++) {
            var d = b[c];
            for (var e in d) a.hasOwnProperty(e) || (a[e] = d[e])
          }
          return a
        },
        inherits: function(a, b) {
          var c = a.prototype,
            d = utils.makeInstance(b.prototype);
          return utils.extend(d, c, !0),
            a.prototype = d,
            d.constructor = a
        },
        bind: function(a, b) {
          return function() {
            return a.apply(b, arguments)
          }
        },
        defer: function(a, b, c) {
          var d;
          return function() {
            c && clearTimeout(d),
              d = setTimeout(a, b)
          }
        },
        indexOf: function(a, b, c) {
          var d = -1;
          return c = this.isNumber(c) ? c: 0,
            this.each(a,
              function(a, e) {
                if (e >= c && a === b) return d = e,
                  !1
              }),
            d
        },
        removeItem: function(a, b) {
          for (var c = 0,
                 d = a.length; c < d; c++) a[c] === b && (a.splice(c, 1), c--)
        },
        trim: function(a) {
          return a.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, "")
        },
        listToMap: function(a) {
          if (!a) return {};
          a = utils.isArray(a) ? a: a.split(",");
          for (var b, c = 0,
                 d = {}; b = a[c++];) d[b.toUpperCase()] = d[b] = 1;
          return d
        },
        unhtml: function(a, b) {
          return a ? a.replace(b || /[&<">'](?:(amp|lt|quot|gt|#39|nbsp|#\d+);)?/g,
            function(a, b) {
              return b ? a: {
                "<": "&lt;",
                "&": "&amp;",
                '"': "&quot;",
                ">": "&gt;",
                "'": "&#39;"
              } [a]
            }) : ""
        },
        unhtmlForUrl: function(a, b) {
          return a ? a.replace(b || /[<">']/g,
            function(a) {
              return {
                "<": "&lt;",
                "&": "&amp;",
                '"': "&quot;",
                ">": "&gt;",
                "'": "&#39;"
              } [a]
            }) : ""
        },
        html: function(a) {
          return a ? a.replace(/&((g|l|quo)t|amp|#39|nbsp);/g,
            function(a) {
              return {
                "&lt;": "<",
                "&amp;": "&",
                "&quot;": '"',
                "&gt;": ">",
                "&#39;": "'",
                "&nbsp;": " "
              } [a]
            }) : ""
        },
        cssStyleToDomStyle: function() {
          var a = document.createElement("div").style,
            b = {
              "float": void 0 != a.cssFloat ? "cssFloat": void 0 != a.styleFloat ? "styleFloat": "float"
            };
          return function(a) {
            return b[a] || (b[a] = a.toLowerCase().replace(/-./g,
              function(a) {
                return a.charAt(1).toUpperCase()
              }))
          }
        } (),
        loadFile: function() {
          function a(a, c) {
            try {
              for (var d, e = 0; d = b[e++];) if (d.doc === a && d.url == (c.src || c.href)) return d
            } catch(f) {
              return null
            }
          }
          var b = [];
          return function(c, d, e) {
            var f = a(c, d);
            if (f) return void(f.ready ? e && e() : f.funs.push(e));
            if (b.push({
              doc: c,
              url: d.src || d.href,
              funs: [e]
            }), !c.body) {
              var g = [];
              for (var h in d)"tag" != h && g.push(h + '="' + d[h] + '"');
              return void c.write("<" + d.tag + " " + g.join(" ") + " ></" + d.tag + ">")
            }
            if (!d.id || !c.getElementById(d.id)) {
              var i = c.createElement(d.tag);
              delete d.tag;
              for (var h in d) i.setAttribute(h, d[h]);
              i.onload = i.onreadystatechange = function() {
                if (!this.readyState || /loaded|complete/.test(this.readyState)) {
                  if (f = a(c, d), f.funs.length > 0) {
                    f.ready = 1;
                    for (var b; b = f.funs.pop();) b()
                  }
                  i.onload = i.onreadystatechange = null
                }
              },
                i.onerror = function() {
                  throw Error("The load " + (d.href || d.src) + " fails,check the url settings of file ueditor.config.js ")
                },
                c.getElementsByTagName("head")[0].appendChild(i)
            }
          }
        } (),
        isEmptyObject: function(a) {
          if (null == a) return ! 0;
          if (this.isArray(a) || this.isString(a)) return 0 === a.length;
          for (var b in a) if (a.hasOwnProperty(b)) return ! 1;
          return ! 0
        },
        fixColor: function(a, b) {
          if (/color/i.test(a) && /rgba?/.test(b)) {
            var c = b.split(",");
            if (c.length > 3) return "";
            b = "#";
            for (var d, e = 0; d = c[e++];) d = parseInt(d.replace(/[^\d]/gi, ""), 10).toString(16),
              b += 1 == d.length ? "0" + d: d;
            b = b.toUpperCase()
          }
          return b
        },
        optCss: function(a) {
          function b(a, b) {
            if (!a) return "";
            var c = a.top,
              d = a.bottom,
              e = a.left,
              f = a.right,
              g = "";
            if (c && e && d && f) g += ";" + b + ":" + (c == d && d == e && e == f ? c: c == d && e == f ? c + " " + e: e == f ? c + " " + e + " " + d: c + " " + f + " " + d + " " + e) + ";";
            else for (var h in a) g += ";" + b + "-" + h + ":" + a[h] + ";";
            return g
          }
          var c, d;
          return a = a.replace(/(padding|margin|border)\-([^:]+):([^;]+);?/gi,
            function(a, b, e, f) {
              if (1 == f.split(" ").length) switch (b) {
                case "padding":
                  return ! c && (c = {}),
                    c[e] = f,
                    "";
                case "margin":
                  return ! d && (d = {}),
                    d[e] = f,
                    "";
                case "border":
                  return "initial" == f ? "": a
              }
              return a
            }),
            a += b(c, "padding") + b(d, "margin"),
            a.replace(/^[ \n\r\t;]*|[ \n\r\t]*$/, "").replace(/;([ \n\r\t]+)|\1;/g, ";").replace(/(&((l|g)t|quot|#39))?;{2,}/g,
              function(a, b) {
                return b ? b + ";;": ";"
              })
        },
        clone: function(a, b) {
          var c;
          b = b || {};
          for (var d in a) a.hasOwnProperty(d) && (c = a[d], "object" == typeof c ? (b[d] = utils.isArray(c) ? [] : {},
            utils.clone(a[d], b[d])) : b[d] = c);
          return b
        },
        transUnitToPx: function(a) {
          if (!/(pt|cm)/.test(a)) return a;
          var b;
          switch (a.replace(/([\d.]+)(\w+)/,
            function(c, d, e) {
              a = d,
                b = e
            }), b) {
            case "cm":
              a = 25 * parseFloat(a);
              break;
            case "pt":
              a = Math.round(96 * parseFloat(a) / 72)
          }
          return a + (a ? "px": "")
        },
        domReady: function() {
          function a(a) {
            a.isReady = !0;
            for (var c; c = b.pop(); c());
          }
          var b = [];
          return function(c, d) {
            d = d || window;
            var e = d.document;
            c && b.push(c),
              "complete" === e.readyState ? a(e) : (e.isReady && a(e), browser.ie && 11 != browser.version ? (!
                function() {
                  if (!e.isReady) {
                    try {
                      e.documentElement.doScroll("left")
                    } catch(b) {
                      return void setTimeout(arguments.callee, 0)
                    }
                    a(e)
                  }
                } (), d.attachEvent("onload",
                function() {
                  a(e)
                })) : (e.addEventListener("DOMContentLoaded",
                function() {
                  e.removeEventListener("DOMContentLoaded", arguments.callee, !1),
                    a(e)
                },
                !1), d.addEventListener("load",
                function() {
                  a(e)
                },
                !1)))
          }
        } (),
        cssRule: browser.ie && 11 != browser.version ?
          function(a, b, c) {
            var d, e;
            if (void 0 === b || b && b.nodeType && 9 == b.nodeType) {
              if (c = b && b.nodeType && 9 == b.nodeType ? b: c || document, d = c.indexList || (c.indexList = {}), e = d[a], void 0 !== e) return c.styleSheets[e].cssText
            } else {
              if (c = c || document, d = c.indexList || (c.indexList = {}), e = d[a], "" === b) return void 0 !== e && (c.styleSheets[e].cssText = "", delete d[a], !0);
              void 0 !== e ? sheetStyle = c.styleSheets[e] : (sheetStyle = c.createStyleSheet("", e = c.styleSheets.length), d[a] = e),
                sheetStyle.cssText = b
            }
          }: function(a, b, c) {
            var d;
            return void 0 === b || b && b.nodeType && 9 == b.nodeType ? (c = b && b.nodeType && 9 == b.nodeType ? b: c || document, d = c.getElementById(a), d ? d.innerHTML: void 0) : (c = c || document, d = c.getElementById(a), "" === b ? !!d && (d.parentNode.removeChild(d), !0) : void(d ? d.innerHTML = b: (d = c.createElement("style"), d.id = a, d.innerHTML = b, c.getElementsByTagName("head")[0].appendChild(d))))
          },
        sort: function(a, b) {
          b = b ||
            function(a, b) {
              return a.localeCompare(b)
            };
          for (var c = 0,
                 d = a.length; c < d; c++) for (var e = c,
                                                  f = a.length; e < f; e++) if (b(a[c], a[e]) > 0) {
            var g = a[c];
            a[c] = a[e],
              a[e] = g
          }
          return a
        },
        serializeParam: function(a) {
          var b = [];
          for (var c in a) if ("method" != c && "timeout" != c && "async" != c) if ("function" != (typeof a[c]).toLowerCase() && "object" != (typeof a[c]).toLowerCase()) b.push(encodeURIComponent(c) + "=" + encodeURIComponent(a[c]));
          else if (utils.isArray(a[c])) for (var d = 0; d < a[c].length; d++) b.push(encodeURIComponent(c) + "[]=" + encodeURIComponent(a[c][d]));
          return b.join("&")
        },
        formatUrl: function(a) {
          var b = a.replace(/&&/g, "&");
          return b = b.replace(/\?&/g, "?"),
            b = b.replace(/&$/g, ""),
            b = b.replace(/&#/g, "#"),
            b = b.replace(/&+/g, "&")
        },
        isCrossDomainUrl: function(a) {
          var b = document.createElement("a");
          return b.href = a,
          browser.ie && (b.href = b.href),
            !(b.protocol == location.protocol && b.hostname == location.hostname && (b.port == location.port || "80" == b.port && "" == location.port || "" == b.port && "80" == location.port))
        },
        clearEmptyAttrs: function(a) {
          for (var b in a)"" === a[b] && delete a[b];
          return a
        },
        str2json: function(a) {
          return utils.isString(a) ? window.JSON ? JSON.parse(a) : new Function("return " + utils.trim(a || ""))() : null
        },
        json2str: function() {
          function a(a) {
            return /["\\\x00-\x1f]/.test(a) && (a = a.replace(/["\\\x00-\x1f]/g,
              function(a) {
                var b = e[a];
                return b ? b: (b = a.charCodeAt(), "\\u00" + Math.floor(b / 16).toString(16) + (b % 16).toString(16))
              })),
            '"' + a + '"'
          }
          function b(a) {
            var b, c, d, e = ["["],
              f = a.length;
            for (c = 0; c < f; c++) switch (d = a[c], typeof d) {
              case "undefined":
              case "function":
              case "unknown":
                break;
              default:
                b && e.push(","),
                  e.push(utils.json2str(d)),
                  b = 1
            }
            return e.push("]"),
              e.join("")
          }
          function c(a) {
            return a < 10 ? "0" + a: a
          }
          function d(a) {
            return '"' + a.getFullYear() + "-" + c(a.getMonth() + 1) + "-" + c(a.getDate()) + "T" + c(a.getHours()) + ":" + c(a.getMinutes()) + ":" + c(a.getSeconds()) + '"'
          }
          if (window.JSON) return JSON.stringify;
          var e = {
            "\b": "\\b",
            "\t": "\\t",
            "\n": "\\n",
            "\f": "\\f",
            "\r": "\\r",
            '"': '\\"',
            "\\": "\\\\"
          };
          return function(c) {
            switch (typeof c) {
              case "undefined":
                return "undefined";
              case "number":
                return isFinite(c) ? String(c) : "null";
              case "string":
                return a(c);
              case "boolean":
                return String(c);
              default:
                if (null === c) return "null";
                if (utils.isArray(c)) return b(c);
                if (utils.isDate(c)) return d(c);
                var e, f, g = ["{"],
                  h = utils.json2str;
                for (var i in c) if (Object.prototype.hasOwnProperty.call(c, i)) switch (f = c[i], typeof f) {
                  case "undefined":
                  case "unknown":
                  case "function":
                    break;
                  default:
                    e && g.push(","),
                      e = 1,
                      g.push(h(i) + ":" + h(f))
                }
                return g.push("}"),
                  g.join("")
            }
          }
        } ()
      };
    utils.each(["String", "Function", "Array", "Number", "RegExp", "Object", "Date"],
      function(a) {
        UE.utils["is" + a] = function(b) {
          return Object.prototype.toString.apply(b) == "[object " + a + "]"
        }
      });
    var EventBase = UE.EventBase = function() {};
    EventBase.prototype = {
      addListener: function(a, b) {
        a = utils.trim(a).split(/\s+/);
        for (var c, d = 0; c = a[d++];) getListener(this, c, !0).push(b)
      },
      on: function(a, b) {
        return this.addListener(a, b)
      },
      off: function(a, b) {
        return this.removeListener(a, b)
      },
      trigger: function() {
        return this.fireEvent.apply(this, arguments)
      },
      removeListener: function(a, b) {
        a = utils.trim(a).split(/\s+/);
        for (var c, d = 0; c = a[d++];) utils.removeItem(getListener(this, c) || [], b)
      },
      fireEvent: function() {
        var a = arguments[0];
        a = utils.trim(a).split(" ");
        for (var b, c = 0; b = a[c++];) {
          var d, e, f, g = getListener(this, b);
          if (g) for (f = g.length; f--;) if (g[f]) {
            if (e = g[f].apply(this, arguments), e === !0) return e;
            void 0 !== e && (d = e)
          } (e = this["on" + b.toLowerCase()]) && (d = e.apply(this, arguments))
        }
        return d
      }
    };
    var dtd = dom.dtd = function() {
        function a(a) {
          for (var b in a) a[b.toUpperCase()] = a[b];
          return a
        }
        var b = utils.extend2,
          c = a({
            isindex: 1,
            fieldset: 1
          }),
          d = a({
            input: 1,
            button: 1,
            select: 1,
            textarea: 1,
            label: 1
          }),
          e = b(a({
            a: 1
          }), d),
          f = b({
              iframe: 1
            },
            e),
          g = a({
            hr: 1,
            ul: 1,
            menu: 1,
            div: 1,
            blockquote: 1,
            noscript: 1,
            table: 1,
            center: 1,
            address: 1,
            dir: 1,
            pre: 1,
            h5: 1,
            dl: 1,
            h4: 1,
            noframes: 1,
            h6: 1,
            ol: 1,
            h1: 1,
            h3: 1,
            h2: 1
          }),
          h = a({
            ins: 1,
            del: 1,
            script: 1,
            style: 1
          }),
          i = b(a({
            b: 1,
            acronym: 1,
            bdo: 1,
            "var": 1,
            "#": 1,
            abbr: 1,
            code: 1,
            br: 1,
            i: 1,
            cite: 1,
            kbd: 1,
            u: 1,
            strike: 1,
            s: 1,
            tt: 1,
            strong: 1,
            q: 1,
            samp: 1,
            em: 1,
            dfn: 1,
            span: 1
          }), h),
          j = b(a({
            sub: 1,
            img: 1,
            embed: 1,
            object: 1,
            sup: 1,
            basefont: 1,
            map: 1,
            applet: 1,
            font: 1,
            big: 1,
            small: 1
          }), i),
          k = b(a({
            p: 1
          }), j),
          l = b(a({
            iframe: 1
          }), j, d),
          m = a({
            img: 1,
            embed: 1,
            noscript: 1,
            br: 1,
            kbd: 1,
            center: 1,
            button: 1,
            basefont: 1,
            h5: 1,
            h4: 1,
            samp: 1,
            h6: 1,
            ol: 1,
            h1: 1,
            h3: 1,
            h2: 1,
            form: 1,
            font: 1,
            "#": 1,
            select: 1,
            menu: 1,
            ins: 1,
            abbr: 1,
            label: 1,
            code: 1,
            table: 1,
            script: 1,
            cite: 1,
            input: 1,
            iframe: 1,
            strong: 1,
            textarea: 1,
            noframes: 1,
            big: 1,
            small: 1,
            span: 1,
            hr: 1,
            sub: 1,
            bdo: 1,
            "var": 1,
            div: 1,
            object: 1,
            sup: 1,
            strike: 1,
            dir: 1,
            map: 1,
            dl: 1,
            applet: 1,
            del: 1,
            isindex: 1,
            fieldset: 1,
            ul: 1,
            b: 1,
            acronym: 1,
            a: 1,
            blockquote: 1,
            i: 1,
            u: 1,
            s: 1,
            tt: 1,
            address: 1,
            q: 1,
            pre: 1,
            p: 1,
            em: 1,
            dfn: 1
          }),
          n = b(a({
            a: 0
          }), l),
          o = a({
            tr: 1
          }),
          p = a({
            "#": 1
          }),
          q = b(a({
            param: 1
          }), m),
          r = b(a({
            form: 1
          }), c, f, g, k),
          s = a({
            li: 1,
            ol: 1,
            ul: 1
          }),
          t = a({
            style: 1,
            script: 1
          }),
          u = a({
            base: 1,
            link: 1,
            meta: 1,
            title: 1
          }),
          v = b(u, t),
          w = a({
            head: 1,
            body: 1
          }),
          x = a({
            html: 1
          }),
          y = a({
            address: 1,
            blockquote: 1,
            center: 1,
            dir: 1,
            div: 1,
            dl: 1,
            fieldset: 1,
            form: 1,
            h1: 1,
            h2: 1,
            h3: 1,
            h4: 1,
            h5: 1,
            h6: 1,
            hr: 1,
            isindex: 1,
            menu: 1,
            noframes: 1,
            ol: 1,
            p: 1,
            pre: 1,
            table: 1,
            ul: 1
          }),
          z = a({
            area: 1,
            base: 1,
            basefont: 1,
            br: 1,
            col: 1,
            command: 1,
            dialog: 1,
            embed: 1,
            hr: 1,
            img: 1,
            input: 1,
            isindex: 1,
            keygen: 1,
            link: 1,
            meta: 1,
            param: 1,
            source: 1,
            track: 1,
            wbr: 1
          });
        return a({
          $nonBodyContent: b(x, w, u),
          $block: y,
          $inline: n,
          $inlineWithA: b(a({
            a: 1
          }), n),
          $body: b(a({
            script: 1,
            style: 1
          }), y),
          $cdata: a({
            script: 1,
            style: 1
          }),
          $empty: z,
          $nonChild: a({
            iframe: 1,
            textarea: 1
          }),
          $listItem: a({
            dd: 1,
            dt: 1,
            li: 1
          }),
          $list: a({
            ul: 1,
            ol: 1,
            dl: 1
          }),
          $isNotEmpty: a({
            table: 1,
            ul: 1,
            ol: 1,
            dl: 1,
            iframe: 1,
            area: 1,
            base: 1,
            col: 1,
            hr: 1,
            img: 1,
            embed: 1,
            input: 1,
            link: 1,
            meta: 1,
            param: 1,
            h1: 1,
            h2: 1,
            h3: 1,
            h4: 1,
            h5: 1,
            h6: 1
          }),
          $removeEmpty: a({
            a: 1,
            abbr: 1,
            acronym: 1,
            address: 1,
            b: 1,
            bdo: 1,
            big: 1,
            cite: 1,
            code: 1,
            del: 1,
            dfn: 1,
            em: 1,
            font: 1,
            i: 1,
            ins: 1,
            label: 1,
            kbd: 1,
            q: 1,
            s: 1,
            samp: 1,
            small: 1,
            span: 1,
            strike: 1,
            strong: 1,
            sub: 1,
            sup: 1,
            tt: 1,
            u: 1,
            "var": 1
          }),
          $removeEmptyBlock: a({
            p: 1,
            div: 1
          }),
          $tableContent: a({
            caption: 1,
            col: 1,
            colgroup: 1,
            tbody: 1,
            td: 1,
            tfoot: 1,
            th: 1,
            thead: 1,
            tr: 1,
            table: 1
          }),
          $notTransContent: a({
            pre: 1,
            script: 1,
            style: 1,
            textarea: 1
          }),
          html: w,
          head: v,
          style: p,
          script: p,
          body: r,
          base: {},
          link: {},
          meta: {},
          title: p,
          col: {},
          tr: a({
            td: 1,
            th: 1
          }),
          img: {},
          embed: {},
          colgroup: a({
            thead: 1,
            col: 1,
            tbody: 1,
            tr: 1,
            tfoot: 1
          }),
          noscript: r,
          td: r,
          br: {},
          th: r,
          center: r,
          kbd: n,
          button: b(k, g),
          basefont: {},
          h5: n,
          h4: n,
          samp: n,
          h6: n,
          ol: s,
          h1: n,
          h3: n,
          option: p,
          h2: n,
          form: b(c, f, g, k),
          select: a({
            optgroup: 1,
            option: 1
          }),
          font: n,
          ins: n,
          menu: s,
          abbr: n,
          label: n,
          table: a({
            thead: 1,
            col: 1,
            tbody: 1,
            tr: 1,
            colgroup: 1,
            caption: 1,
            tfoot: 1
          }),
          code: n,
          tfoot: o,
          cite: n,
          li: r,
          input: {},
          iframe: r,
          strong: n,
          textarea: p,
          noframes: r,
          big: n,
          small: n,
          span: a({
            "#": 1,
            br: 1,
            b: 1,
            strong: 1,
            u: 1,
            i: 1,
            em: 1,
            sub: 1,
            sup: 1,
            strike: 1,
            span: 1
          }),
          hr: n,
          dt: n,
          sub: n,
          optgroup: a({
            option: 1
          }),
          param: {},
          bdo: n,
          "var": n,
          div: r,
          object: q,
          sup: n,
          dd: r,
          strike: n,
          area: {},
          dir: s,
          map: b(a({
            area: 1,
            form: 1,
            p: 1
          }), c, h, g),
          applet: q,
          dl: a({
            dt: 1,
            dd: 1
          }),
          del: n,
          isindex: {},
          fieldset: b(a({
            legend: 1
          }), m),
          thead: o,
          ul: s,
          acronym: n,
          b: n,
          a: b(a({
            a: 1
          }), l),
          blockquote: b(a({
            td: 1,
            tr: 1,
            tbody: 1,
            li: 1
          }), r),
          caption: n,
          i: n,
          u: n,
          tbody: o,
          s: n,
          address: b(f, k),
          tt: n,
          legend: n,
          q: n,
          pre: b(i, e),
          p: b(a({
            a: 1
          }), n),
          em: n,
          dfn: n
        })
      } (),
      attrFix = ie && browser.version < 9 ? {
        tabindex: "tabIndex",
        readonly: "readOnly",
        "for": "htmlFor",
        "class": "className",
        maxlength: "maxLength",
        cellspacing: "cellSpacing",
        cellpadding: "cellPadding",
        rowspan: "rowSpan",
        colspan: "colSpan",
        usemap: "useMap",
        frameborder: "frameBorder"
      }: {
        tabindex: "tabIndex",
        readonly: "readOnly"
      },
      styleBlock = utils.listToMap(["-webkit-box", "-moz-box", "block", "list-item", "table", "table-row-group", "table-header-group", "table-footer-group", "table-row", "table-column-group", "table-column", "table-cell", "table-caption"]),
      domUtils = dom.domUtils = {
        NODE_ELEMENT: 1,
        NODE_DOCUMENT: 9,
        NODE_TEXT: 3,
        NODE_COMMENT: 8,
        NODE_DOCUMENT_FRAGMENT: 11,
        POSITION_IDENTICAL: 0,
        POSITION_DISCONNECTED: 1,
        POSITION_FOLLOWING: 2,
        POSITION_PRECEDING: 4,
        POSITION_IS_CONTAINED: 8,
        POSITION_CONTAINS: 16,
        fillChar: ie && "6" == browser.version ? "\ufeff": "​",
        keys: {
          8 : 1,
          46 : 1,
          16 : 1,
          17 : 1,
          18 : 1,
          37 : 1,
          38 : 1,
          39 : 1,
          40 : 1,
          13 : 1
        },
        getPosition: function(a, b) {
          if (a === b) return 0;
          var c, d = [a],
            e = [b];
          for (c = a; c = c.parentNode;) {
            if (c === b) return 10;
            d.push(c)
          }
          for (c = b; c = c.parentNode;) {
            if (c === a) return 20;
            e.push(c)
          }
          if (d.reverse(), e.reverse(), d[0] !== e[0]) return 1;
          for (var f = -1; f++, d[f] === e[f];);
          for (a = d[f], b = e[f]; a = a.nextSibling;) if (a === b) return 4;
          return 2
        },
        getNodeIndex: function(a, b) {
          for (var c = a,
                 d = 0; c = c.previousSibling;) b && 3 == c.nodeType ? c.nodeType != c.nextSibling.nodeType && d++:d++;
          return d
        },
        inDoc: function(a, b) {
          return 10 == domUtils.getPosition(a, b)
        },
        findParent: function(a, b, c) {
          if (a && !domUtils.isBody(a)) for (a = c ? a: a.parentNode; a;) {
            if (!b || b(a) || domUtils.isBody(a)) return b && !b(a) && domUtils.isBody(a) ? null: a;
            a = a.parentNode
          }
          return null
        },
        findParentByTagName: function(a, b, c, d) {
          return b = utils.listToMap(utils.isArray(b) ? b: [b]),
            domUtils.findParent(a,
              function(a) {
                return b[a.tagName] && !(d && d(a))
              },
              c)
        },
        findParents: function(a, b, c, d) {
          for (var e = b && (c && c(a) || !c) ? [a] : []; a = domUtils.findParent(a, c);) e.push(a);
          return d ? e: e.reverse()
        },
        insertAfter: function(a, b) {
          return a.nextSibling ? a.parentNode.insertBefore(b, a.nextSibling) : a.parentNode.appendChild(b)
        },
        remove: function(a, b) {
          var c, d = a.parentNode;
          if (d) {
            if (b && a.hasChildNodes()) for (; c = a.firstChild;) d.insertBefore(c, a);
            d.removeChild(a)
          }
          return a
        },
        getNextDomNode: function(a, b, c, d) {
          return getDomNode(a, "firstChild", "nextSibling", b, c, d)
        },
        getPreDomNode: function(a, b, c, d) {
          return getDomNode(a, "lastChild", "previousSibling", b, c, d)
        },
        isBookmarkNode: function(a) {
          return 1 == a.nodeType && a.id && /^_baidu_bookmark_/i.test(a.id)
        },
        getWindow: function(a) {
          var b = a.ownerDocument || a;
          return b.defaultView || b.parentWindow
        },
        getCommonAncestor: function(a, b) {
          if (a === b) return a;
          for (var c = [a], d = [b], e = a, f = -1; e = e.parentNode;) {
            if (e === b) return e;
            c.push(e)
          }
          for (e = b; e = e.parentNode;) {
            if (e === a) return e;
            d.push(e)
          }
          for (c.reverse(), d.reverse(); f++, c[f] === d[f];);
          return 0 == f ? null: c[f - 1]
        },
        clearEmptySibling: function(a, b, c) {
          function d(a, b) {
            for (var c; a && !domUtils.isBookmarkNode(a) && (domUtils.isEmptyInlineElement(a) || !new RegExp("[^\t\n\r" + domUtils.fillChar + "]").test(a.nodeValue));) c = a[b],
              domUtils.remove(a),
              a = c
          } ! b && d(a.nextSibling, "nextSibling"),
          !c && d(a.previousSibling, "previousSibling")
        },
        split: function(a, b) {
          var c = a.ownerDocument;
          if (browser.ie && b == a.nodeValue.length) {
            var d = c.createTextNode("");
            return domUtils.insertAfter(a, d)
          }
          var e = a.splitText(b);
          if (browser.ie8) {
            var f = c.createTextNode("");
            domUtils.insertAfter(e, f),
              domUtils.remove(f)
          }
          return e
        },
        isWhitespace: function(a) {
          return ! new RegExp("[^ \t\n\r" + domUtils.fillChar + "]").test(a.nodeValue)
        },
        getXY: function(a) {
          for (var b = 0,
                 c = 0; a.offsetParent;) c += a.offsetTop,
            b += a.offsetLeft,
            a = a.offsetParent;
          return {
            x: b,
            y: c
          }
        },
        on: function(a, b, c) {
          var d = utils.isArray(b) ? b: utils.trim(b).split(/\s+/),
            e = d.length;
          if (e) for (; e--;) if (b = d[e], a.addEventListener) a.addEventListener(b, c, !1);
          else {
            c._d || (c._d = {
              els: []
            });
            var f = b + c.toString(),
              g = utils.indexOf(c._d.els, a);
            c._d[f] && g != -1 || (g == -1 && c._d.els.push(a), c._d[f] || (c._d[f] = function(a) {
              return c.call(a.srcElement, a || window.event)
            }), a.attachEvent("on" + b, c._d[f]))
          }
          a = null
        },
        un: function(a, b, c) {
          var d = utils.isArray(b) ? b: utils.trim(b).split(/\s+/),
            e = d.length;
          if (e) for (; e--;) if (b = d[e], a.removeEventListener) a.removeEventListener(b, c, !1);
          else {
            var f = b + c.toString();
            try {
              a.detachEvent("on" + b, c._d ? c._d[f] : c)
            } catch(g) {}
            if (c._d && c._d[f]) {
              var h = utils.indexOf(c._d.els, a);
              h != -1 && c._d.els.splice(h, 1),
              0 == c._d.els.length && delete c._d[f]
            }
          }
        },
        isSameElement: function(a, b) {
          if (a.tagName != b.tagName) return ! 1;
          var c = a.attributes,
            d = b.attributes;
          if (!ie && c.length != d.length) return ! 1;
          for (var e, f, g = 0,
                 h = 0,
                 i = 0; e = c[i++];) {
            if ("style" == e.nodeName) {
              if (e.specified && g++, domUtils.isSameStyle(a, b)) continue;
              return ! 1
            }
            if (ie) {
              if (!e.specified) continue;
              g++,
                f = d.getNamedItem(e.nodeName)
            } else f = b.attributes[e.nodeName];
            if (!f.specified || e.nodeValue != f.nodeValue) return ! 1
          }
          if (ie) {
            for (i = 0; f = d[i++];) f.specified && h++;
            if (g != h) return ! 1
          }
          return ! 0
        },
        isSameStyle: function(a, b) {
          var c = a.style.cssText.replace(/( ?; ?)/g, ";").replace(/( ?: ?)/g, ":"),
            d = b.style.cssText.replace(/( ?; ?)/g, ";").replace(/( ?: ?)/g, ":");
          if (browser.opera) {
            if (c = a.style, d = b.style, c.length != d.length) return ! 1;
            for (var e in c) if (!/^(\d+|csstext)$/i.test(e) && c[e] != d[e]) return ! 1;
            return ! 0
          }
          if (!c || !d) return c == d;
          if (c = c.split(";"), d = d.split(";"), c.length != d.length) return ! 1;
          for (var f, g = 0; f = c[g++];) if (utils.indexOf(d, f) == -1) return ! 1;
          return ! 0
        },
        isBlockElm: function(a) {
          return 1 == a.nodeType && (dtd.$block[a.tagName] || styleBlock[domUtils.getComputedStyle(a, "display")]) && !dtd.$nonChild[a.tagName]
        },
        isBody: function(a) {
          return a && 1 == a.nodeType && "body" == a.tagName.toLowerCase()
        },
        breakParent: function(a, b) {
          var c, d, e, f = a,
            g = a;
          do {
            for (f = f.parentNode, d ? (c = f.cloneNode(!1), c.appendChild(d), d = c, c = f.cloneNode(!1), c.appendChild(e), e = c) : (d = f.cloneNode(!1), e = d.cloneNode(!1)); c = g.previousSibling;) d.insertBefore(c, d.firstChild);
            for (; c = g.nextSibling;) e.appendChild(c);
            g = f
          } while ( b !== f );
          return c = b.parentNode,
            c.insertBefore(d, b),
            c.insertBefore(e, b),
            c.insertBefore(a, e),
            domUtils.remove(b),
            a
        },
        isEmptyInlineElement: function(a) {
          if (1 != a.nodeType || !dtd.$removeEmpty[a.tagName]) return 0;
          for (a = a.firstChild; a;) {
            if (domUtils.isBookmarkNode(a)) return 0;
            if (1 == a.nodeType && !domUtils.isEmptyInlineElement(a) || 3 == a.nodeType && !domUtils.isWhitespace(a)) return 0;
            a = a.nextSibling
          }
          return 1
        },
        trimWhiteTextNode: function(a) {
          function b(b) {
            for (var c; (c = a[b]) && 3 == c.nodeType && domUtils.isWhitespace(c);) a.removeChild(c)
          }
          b("firstChild"),
            b("lastChild")
        },
        mergeChild: function(a, b, c) {
          for (var d, e = domUtils.getElementsByTagName(a, a.tagName.toLowerCase()), f = 0; d = e[f++];) if (d.parentNode && !domUtils.isBookmarkNode(d)) if ("span" != d.tagName.toLowerCase()) domUtils.isSameElement(a, d) && domUtils.remove(d, !0);
          else {
            if (a === d.parentNode && (domUtils.trimWhiteTextNode(a), 1 == a.childNodes.length)) {
              a.style.cssText = d.style.cssText + ";" + a.style.cssText,
                domUtils.remove(d, !0);
              continue
            }
            if (d.style.cssText = a.style.cssText + ";" + d.style.cssText, c) {
              var g = c.style;
              if (g) {
                g = g.split(";");
                for (var h, i = 0; h = g[i++];) d.style[utils.cssStyleToDomStyle(h.split(":")[0])] = h.split(":")[1]
              }
            }
            domUtils.isSameStyle(d, a) && domUtils.remove(d, !0)
          }
        },
        getElementsByTagName: function(a, b, c) {
          if (c && utils.isString(c)) {
            var d = c;
            c = function(a) {
              return domUtils.hasClass(a, d)
            }
          }
          b = utils.trim(b).replace(/[ ]{2,}/g, " ").split(" ");
          for (var e, f = [], g = 0; e = b[g++];) for (var h, i = a.getElementsByTagName(e), j = 0; h = i[j++];) c && !c(h) || f.push(h);
          return f
        },
        mergeToParent: function(a) {
          for (var b = a.parentNode; b && dtd.$removeEmpty[b.tagName];) {
            if (b.tagName == a.tagName || "A" == b.tagName) {
              if (domUtils.trimWhiteTextNode(b), "SPAN" == b.tagName && !domUtils.isSameStyle(b, a) || "A" == b.tagName && "SPAN" == a.tagName) {
                if (b.childNodes.length > 1 || b !== a.parentNode) {
                  a.style.cssText = b.style.cssText + ";" + a.style.cssText,
                    b = b.parentNode;
                  continue
                }
                b.style.cssText += ";" + a.style.cssText,
                "A" == b.tagName && (b.style.textDecoration = "underline")
              }
              if ("A" != b.tagName) {
                b === a.parentNode && domUtils.remove(a, !0);
                break
              }
            }
            b = b.parentNode
          }
        },
        mergeSibling: function(a, b, c) {
          function d(a, b, c) {
            var d;
            if ((d = c[a]) && !domUtils.isBookmarkNode(d) && 1 == d.nodeType && domUtils.isSameElement(c, d)) {
              for (; d.firstChild;)"firstChild" == b ? c.insertBefore(d.lastChild, c.firstChild) : c.appendChild(d.firstChild);
              domUtils.remove(d)
            }
          } ! b && d("previousSibling", "firstChild", a),
          !c && d("nextSibling", "lastChild", a)
        },
        unSelectable: ie && browser.ie9below || browser.opera ?
          function(a) {
            a.onselectstart = function() {
              return ! 1
            },
              a.onclick = a.onkeyup = a.onkeydown = function() {
                return ! 1
              },
              a.unselectable = "on",
              a.setAttribute("unselectable", "on");
            for (var b, c = 0; b = a.all[c++];) switch (b.tagName.toLowerCase()) {
              case "iframe":
              case "textarea":
              case "input":
              case "select":
                break;
              default:
                b.unselectable = "on",
                  a.setAttribute("unselectable", "on")
            }
          }: function(a) {
            a.style.MozUserSelect = a.style.webkitUserSelect = a.style.msUserSelect = a.style.KhtmlUserSelect = "none"
          },
        removeAttributes: function(a, b) {
          b = utils.isArray(b) ? b: utils.trim(b).replace(/[ ]{2,}/g, " ").split(" ");
          for (var c, d = 0; c = b[d++];) {
            switch (c = attrFix[c] || c) {
              case "className":
                a[c] = "";
                break;
              case "style":
                a.style.cssText = "";
                var e = a.getAttributeNode("style"); ! browser.ie && e && a.removeAttributeNode(e)
            }
            a.removeAttribute(c)
          }
        },
        createElement: function(a, b, c) {
          return domUtils.setAttributes(a.createElement(b), c)
        },
        setAttributes: function(a, b) {
          for (var c in b) if (b.hasOwnProperty(c)) {
            var d = b[c];
            switch (c) {
              case "class":
                a.className = d;
                break;
              case "style":
                a.style.cssText = a.style.cssText + ";" + d;
                break;
              case "innerHTML":
                a[c] = d;
                break;
              case "value":
                a.value = d;
                break;
              default:
                a.setAttribute(attrFix[c] || c, d)
            }
          }
          return a
        },
        getComputedStyle: function(a, b) {
          var c = "width height top left";
          if (c.indexOf(b) > -1) return a["offset" + b.replace(/^\w/,
            function(a) {
              return a.toUpperCase()
            })] + "px";
          if (3 == a.nodeType && (a = a.parentNode), browser.ie && browser.version < 9 && "font-size" == b && !a.style.fontSize && !dtd.$empty[a.tagName] && !dtd.$nonChild[a.tagName]) {
            var d = a.ownerDocument.createElement("span");
            d.style.cssText = "padding:0;border:0;font-family:simsun;",
              d.innerHTML = ".",
              a.appendChild(d);
            var e = d.offsetHeight;
            return a.removeChild(d),
              d = null,
            e + "px"
          }
          try {
            var f = domUtils.getStyle(a, b) || (window.getComputedStyle ? domUtils.getWindow(a).getComputedStyle(a, "").getPropertyValue(b) : (a.currentStyle || a.style)[utils.cssStyleToDomStyle(b)])
          } catch(g) {
            return ""
          }
          return utils.transUnitToPx(utils.fixColor(b, f))
        },
        removeClasses: function(a, b) {
          b = utils.isArray(b) ? b: utils.trim(b).replace(/[ ]{2,}/g, " ").split(" ");
          for (var c, d = 0,
                 e = a.className; c = b[d++];) e = e.replace(new RegExp("\\b" + c + "\\b"), "");
          e = utils.trim(e).replace(/[ ]{2,}/g, " "),
            e ? a.className = e: domUtils.removeAttributes(a, ["class"])
        },
        addClass: function(a, b) {
          if (a) {
            b = utils.trim(b).replace(/[ ]{2,}/g, " ").split(" ");
            for (var c, d = 0,
                   e = a.className; c = b[d++];) new RegExp("\\b" + c + "\\b").test(e) || (e += " " + c);
            a.className = utils.trim(e)
          }
        },
        hasClass: function(a, b) {
          if (utils.isRegExp(b)) return b.test(a.className);
          b = utils.trim(b).replace(/[ ]{2,}/g, " ").split(" ");
          for (var c, d = 0,
                 e = a.className; c = b[d++];) if (!new RegExp("\\b" + c + "\\b", "i").test(e)) return ! 1;
          return d - 1 == b.length
        },
        preventDefault: function(a) {
          a.preventDefault ? a.preventDefault() : a.returnValue = !1
        },
        removeStyle: function(a, b) {
          browser.ie ? ("color" == b && (b = "(^|;)" + b), a.style.cssText = a.style.cssText.replace(new RegExp(b + "[^:]*:[^;]+;?", "ig"), "")) : a.style.removeProperty ? a.style.removeProperty(b) : a.style.removeAttribute(utils.cssStyleToDomStyle(b)),
          a.style.cssText || domUtils.removeAttributes(a, ["style"])
        },
        getStyle: function(a, b) {
          var c = a.style[utils.cssStyleToDomStyle(b)];
          return utils.fixColor(b, c)
        },
        setStyle: function(a, b, c) {
          a.style[utils.cssStyleToDomStyle(b)] = c,
          utils.trim(a.style.cssText) || this.removeAttributes(a, "style")
        },
        setStyles: function(a, b) {
          for (var c in b) b.hasOwnProperty(c) && domUtils.setStyle(a, c, b[c])
        },
        removeDirtyAttr: function(a) {
          for (var b, c = 0,
                 d = a.getElementsByTagName("*"); b = d[c++];) b.removeAttribute("_moz_dirty");
          a.removeAttribute("_moz_dirty")
        },
        getChildCount: function(a, b) {
          var c = 0,
            d = a.firstChild;
          for (b = b ||
            function() {
              return 1
            }; d;) b(d) && c++,
            d = d.nextSibling;
          return c
        },
        isEmptyNode: function(a) {
          return ! a.firstChild || 0 == domUtils.getChildCount(a,
            function(a) {
              return ! domUtils.isBr(a) && !domUtils.isBookmarkNode(a) && !domUtils.isWhitespace(a)
            })
        },
        clearSelectedArr: function(a) {
          for (var b; b = a.pop();) domUtils.removeAttributes(b, ["class"])
        },
        scrollToView: function(a, b, c) {
          var d = function() {
              var a = b.document,
                c = "CSS1Compat" == a.compatMode;
              return {
                width: (c ? a.documentElement.clientWidth: a.body.clientWidth) || 0,
                height: (c ? a.documentElement.clientHeight: a.body.clientHeight) || 0
              }
            },
            e = function(a) {
              if ("pageXOffset" in a) return {
                x: a.pageXOffset || 0,
                y: a.pageYOffset || 0
              };
              var b = a.document;
              return {
                x: b.documentElement.scrollLeft || b.body.scrollLeft || 0,
                y: b.documentElement.scrollTop || b.body.scrollTop || 0
              }
            },
            f = d().height,
            g = f * -1 + c;
          g += a.offsetHeight || 0;
          var h = domUtils.getXY(a);
          g += h.y;
          var i = e(b).y; (g > i || g < i - f) && b.scrollTo(0, g + (g < 0 ? -20 : 20))
        },
        isBr: function(a) {
          return 1 == a.nodeType && "BR" == a.tagName
        },
        isFillChar: function(a, b) {
          if (3 != a.nodeType) return ! 1;
          var c = a.nodeValue;
          return b ? new RegExp("^" + domUtils.fillChar).test(c) : !c.replace(new RegExp(domUtils.fillChar, "g"), "").length
        },
        isStartInblock: function(a) {
          var b, c = a.cloneRange(),
            d = 0,
            e = c.startContainer;
          if (1 == e.nodeType && e.childNodes[c.startOffset]) {
            e = e.childNodes[c.startOffset];
            for (var f = e.previousSibling; f && domUtils.isFillChar(f);) e = f,
              f = f.previousSibling
          }
          for (this.isFillChar(e, !0) && 1 == c.startOffset && (c.setStartBefore(e), e = c.startContainer); e && domUtils.isFillChar(e);) b = e,
            e = e.previousSibling;
          for (b && (c.setStartBefore(b), e = c.startContainer), 1 == e.nodeType && domUtils.isEmptyNode(e) && 1 == c.startOffset && c.setStart(e, 0).collapse(!0); ! c.startOffset;) {
            if (e = c.startContainer, domUtils.isBlockElm(e) || domUtils.isBody(e)) {
              d = 1;
              break
            }
            var g, f = c.startContainer.previousSibling;
            if (f) {
              for (; f && domUtils.isFillChar(f);) g = f,
                f = f.previousSibling;
              g ? c.setStartBefore(g) : c.setStartBefore(c.startContainer)
            } else c.setStartBefore(c.startContainer)
          }
          return d && !domUtils.isBody(c.startContainer) ? 1 : 0
        },
        isEmptyBlock: function(a, b) {
          if (1 != a.nodeType) return 0;
          if (b = b || new RegExp("[  \t\r\n" + domUtils.fillChar + "]", "g"), a[browser.ie ? "innerText": "textContent"].replace(b, "").length > 0) return 0;
          for (var c in dtd.$isNotEmpty) if (a.getElementsByTagName(c).length) return 0;
          return 1
        },
        setViewportOffset: function(a, b) {
          var c = 0 | parseInt(a.style.left),
            d = 0 | parseInt(a.style.top),
            e = a.getBoundingClientRect(),
            f = b.left - e.left,
            g = b.top - e.top;
          f && (a.style.left = c + f + "px"),
          g && (a.style.top = d + g + "px")
        },
        fillNode: function(a, b) {
          var c = browser.ie ? a.createTextNode(domUtils.fillChar) : a.createElement("br");
          b.innerHTML = "",
            b.appendChild(c)
        },
        moveChild: function(a, b, c) {
          for (; a.firstChild;) c && b.firstChild ? b.insertBefore(a.lastChild, b.firstChild) : b.appendChild(a.firstChild)
        },
        hasNoAttributes: function(a) {
          return browser.ie ? /^<\w+\s*?>/.test(a.outerHTML) : 0 == a.attributes.length
        },
        isCustomeNode: function(a) {
          return 1 == a.nodeType && a.getAttribute("_ue_custom_node_")
        },
        isTagNode: function(a, b) {
          return 1 == a.nodeType && new RegExp("\\b" + a.tagName + "\\b", "i").test(b)
        },
        filterNodeList: function(a, b, c) {
          var d = [];
          if (!utils.isFunction(b)) {
            var e = b;
            b = function(a) {
              return utils.indexOf(utils.isArray(e) ? e: e.split(" "), a.tagName.toLowerCase()) != -1
            }
          }
          return utils.each(a,
            function(a) {
              b(a) && d.push(a)
            }),
            0 == d.length ? null: 1 != d.length && c ? d: d[0]
        },
        isInNodeEndBoundary: function(a, b) {
          var c = a.startContainer;
          if (3 == c.nodeType && a.startOffset != c.nodeValue.length) return 0;
          if (1 == c.nodeType && a.startOffset != c.childNodes.length) return 0;
          for (; c !== b;) {
            if (c.nextSibling) return 0;
            c = c.parentNode
          }
          return 1
        },
        isBoundaryNode: function(a, b) {
          for (var c; ! domUtils.isBody(a);) if (c = a, a = a.parentNode, c !== a[b]) return ! 1;
          return ! 0
        },
        fillHtml: browser.ie11below ? "&nbsp;": "<br/>"
      },
      fillCharReg = new RegExp(domUtils.fillChar, "g"); !
      function() {
        function a(a) {
          a.collapsed = a.startContainer && a.endContainer && a.startContainer === a.endContainer && a.startOffset == a.endOffset
        }
        function b(a) {
          return ! a.collapsed && 1 == a.startContainer.nodeType && a.startContainer === a.endContainer && a.endOffset - a.startOffset == 1
        }
        function c(b, c, d, e) {
          return 1 == c.nodeType && (dtd.$empty[c.tagName] || dtd.$nonChild[c.tagName]) && (d = domUtils.getNodeIndex(c) + (b ? 0 : 1), c = c.parentNode),
            b ? (e.startContainer = c, e.startOffset = d, e.endContainer || e.collapse(!0)) : (e.endContainer = c, e.endOffset = d, e.startContainer || e.collapse(!1)),
            a(e),
            e
        }
        function d(a, b) {
          var c, d, e = a.startContainer,
            f = a.endContainer,
            g = a.startOffset,
            h = a.endOffset,
            i = a.document,
            j = i.createDocumentFragment();
          if (1 == e.nodeType && (e = e.childNodes[g] || (c = e.appendChild(i.createTextNode("")))), 1 == f.nodeType && (f = f.childNodes[h] || (d = f.appendChild(i.createTextNode("")))), e === f && 3 == e.nodeType) return j.appendChild(i.createTextNode(e.substringData(g, h - g))),
          b && (e.deleteData(g, h - g), a.collapse(!0)),
            j;
          for (var k, l, m = j,
                 n = domUtils.findParents(e, !0), o = domUtils.findParents(f, !0), p = 0; n[p] == o[p];) p++;
          for (var q, r = p; q = n[r]; r++) {
            for (k = q.nextSibling, q == e ? c || (3 == a.startContainer.nodeType ? (m.appendChild(i.createTextNode(e.nodeValue.slice(g))), b && e.deleteData(g, e.nodeValue.length - g)) : m.appendChild(b ? e: e.cloneNode(!0))) : (l = q.cloneNode(!1), m.appendChild(l)); k && k !== f && k !== o[r];) q = k.nextSibling,
              m.appendChild(b ? k: k.cloneNode(!0)),
              k = q;
            m = l
          }
          m = j,
          n[p] || (m.appendChild(n[p - 1].cloneNode(!1)), m = m.firstChild);
          for (var s, r = p; s = o[r]; r++) {
            if (k = s.previousSibling, s == f ? d || 3 != a.endContainer.nodeType || (m.appendChild(i.createTextNode(f.substringData(0, h))), b && f.deleteData(0, h)) : (l = s.cloneNode(!1), m.appendChild(l)), r != p || !n[p]) for (; k && k !== e;) s = k.previousSibling,
              m.insertBefore(b ? k: k.cloneNode(!0), m.firstChild),
              k = s;
            m = l
          }
          return b && a.setStartBefore(o[p] ? n[p] ? o[p] : n[p - 1] : o[p - 1]).collapse(!0),
          c && domUtils.remove(c),
          d && domUtils.remove(d),
            j
        }
        function e(a, b) {
          try {
            if (g && domUtils.inDoc(g, a)) if (g.nodeValue.replace(fillCharReg, "").length) g.nodeValue = g.nodeValue.replace(fillCharReg, "");
            else {
              var c = g.parentNode;
              for (domUtils.remove(g); c && domUtils.isEmptyInlineElement(c) && (browser.safari ? !(domUtils.getPosition(c, b) & domUtils.POSITION_CONTAINS) : !c.contains(b));) g = c.parentNode,
                domUtils.remove(c),
                c = g
            }
          } catch(d) {}
        }
        function f(a, b) {
          var c;
          for (a = a[b]; a && domUtils.isFillChar(a);) c = a[b],
            domUtils.remove(a),
            a = c
        }
        var g, h = 0,
          i = domUtils.fillChar,
          j = dom.Range = function(a) {
            var b = this;
            b.startContainer = b.startOffset = b.endContainer = b.endOffset = null,
              b.document = a,
              b.collapsed = !0
          };
        j.prototype = {
          cloneContents: function() {
            return this.collapsed ? null: d(this, 0)
          },
          deleteContents: function() {
            var a;
            return this.collapsed || d(this, 1),
            browser.webkit && (a = this.startContainer, 3 != a.nodeType || a.nodeValue.length || (this.setStartBefore(a).collapse(!0), domUtils.remove(a))),
              this
          },
          extractContents: function() {
            return this.collapsed ? null: d(this, 2)
          },
          setStart: function(a, b) {
            return c(!0, a, b, this)
          },
          setEnd: function(a, b) {
            return c(!1, a, b, this)
          },
          setStartAfter: function(a) {
            return this.setStart(a.parentNode, domUtils.getNodeIndex(a) + 1)
          },
          setStartBefore: function(a) {
            return this.setStart(a.parentNode, domUtils.getNodeIndex(a))
          },
          setEndAfter: function(a) {
            return this.setEnd(a.parentNode, domUtils.getNodeIndex(a) + 1)
          },
          setEndBefore: function(a) {
            return this.setEnd(a.parentNode, domUtils.getNodeIndex(a))
          },
          setStartAtFirst: function(a) {
            return this.setStart(a, 0)
          },
          setStartAtLast: function(a) {
            return this.setStart(a, 3 == a.nodeType ? a.nodeValue.length: a.childNodes.length)
          },
          setEndAtFirst: function(a) {
            return this.setEnd(a, 0)
          },
          setEndAtLast: function(a) {
            return this.setEnd(a, 3 == a.nodeType ? a.nodeValue.length: a.childNodes.length)
          },
          selectNode: function(a) {
            return this.setStartBefore(a).setEndAfter(a)
          },
          selectNodeContents: function(a) {
            return this.setStart(a, 0).setEndAtLast(a)
          },
          cloneRange: function() {
            var a = this;
            return new j(a.document).setStart(a.startContainer, a.startOffset).setEnd(a.endContainer, a.endOffset)
          },
          collapse: function(a) {
            var b = this;
            return a ? (b.endContainer = b.startContainer, b.endOffset = b.startOffset) : (b.startContainer = b.endContainer, b.startOffset = b.endOffset),
              b.collapsed = !0,
              b
          },
          shrinkBoundary: function(a) {
            function b(a) {
              return 1 == a.nodeType && !domUtils.isBookmarkNode(a) && !dtd.$empty[a.tagName] && !dtd.$nonChild[a.tagName]
            }
            for (var c, d = this,
                   e = d.collapsed; 1 == d.startContainer.nodeType && (c = d.startContainer.childNodes[d.startOffset]) && b(c);) d.setStart(c, 0);
            if (e) return d.collapse(!0);
            if (!a) for (; 1 == d.endContainer.nodeType && d.endOffset > 0 && (c = d.endContainer.childNodes[d.endOffset - 1]) && b(c);) d.setEnd(c, c.childNodes.length);
            return d
          },
          getCommonAncestor: function(a, c) {
            var d = this,
              e = d.startContainer,
              f = d.endContainer;
            return e === f ? a && b(this) && (e = e.childNodes[d.startOffset], 1 == e.nodeType) ? e: c && 3 == e.nodeType ? e.parentNode: e: domUtils.getCommonAncestor(e, f)
          },
          trimBoundary: function(a) {
            this.txtToElmBoundary();
            var b = this.startContainer,
              c = this.startOffset,
              d = this.collapsed,
              e = this.endContainer;
            if (3 == b.nodeType) {
              if (0 == c) this.setStartBefore(b);
              else if (c >= b.nodeValue.length) this.setStartAfter(b);
              else {
                var f = domUtils.split(b, c);
                b === e ? this.setEnd(f, this.endOffset - c) : b.parentNode === e && (this.endOffset += 1),
                  this.setStartBefore(f)
              }
              if (d) return this.collapse(!0)
            }
            return a || (c = this.endOffset, e = this.endContainer, 3 == e.nodeType && (0 == c ? this.setEndBefore(e) : (c < e.nodeValue.length && domUtils.split(e, c), this.setEndAfter(e)))),
              this
          },
          txtToElmBoundary: function(a) {
            function b(a, b) {
              var c = a[b + "Container"],
                d = a[b + "Offset"];
              3 == c.nodeType && (d ? d >= c.nodeValue.length && a["set" + b.replace(/(\w)/,
                function(a) {
                  return a.toUpperCase()
                }) + "After"](c) : a["set" + b.replace(/(\w)/,
                function(a) {
                  return a.toUpperCase()
                }) + "Before"](c))
            }
            return ! a && this.collapsed || (b(this, "start"), b(this, "end")),
              this
          },
          insertNode: function(a) {
            var b = a,
              c = 1;
            11 == a.nodeType && (b = a.firstChild, c = a.childNodes.length),
              this.trimBoundary(!0);
            var d = this.startContainer,
              e = this.startOffset,
              f = d.childNodes[e];
            return f ? d.insertBefore(a, f) : d.appendChild(a),
            b.parentNode === this.endContainer && (this.endOffset = this.endOffset + c),
              this.setStartBefore(b)
          },
          setCursor: function(a, b) {
            return this.collapse(!a).select(b)
          },
          createBookmark: function(a, b) {
            var c, d = this.document.createElement("span");
            return d.style.cssText = "display:none;line-height:0px;",
              d.appendChild(this.document.createTextNode("‍")),
              d.id = "_baidu_bookmark_start_" + (b ? "": h++),
            this.collapsed || (c = d.cloneNode(!0), c.id = "_baidu_bookmark_end_" + (b ? "": h++)),
              this.insertNode(d),
            c && this.collapse().insertNode(c).setEndBefore(c),
              this.setStartAfter(d),
              {
                start: a ? d.id: d,
                end: c ? a ? c.id: c: null,
                id: a
              }
          },
          moveToBookmark: function(a) {
            var b = a.id ? this.document.getElementById(a.start) : a.start,
              c = a.end && a.id ? this.document.getElementById(a.end) : a.end;
            return this.setStartBefore(b),
              domUtils.remove(b),
              c ? (this.setEndBefore(c), domUtils.remove(c)) : this.collapse(!0),
              this
          },
          enlarge: function(a, b) {
            var c, d, e = domUtils.isBody,
              f = this.document.createTextNode("");
            if (a) {
              for (d = this.startContainer, 1 == d.nodeType ? d.childNodes[this.startOffset] ? c = d = d.childNodes[this.startOffset] : (d.appendChild(f), c = d = f) : c = d;;) {
                if (domUtils.isBlockElm(d)) {
                  for (d = c; (c = d.previousSibling) && !domUtils.isBlockElm(c);) d = c;
                  this.setStartBefore(d);
                  break
                }
                c = d,
                  d = d.parentNode
              }
              for (d = this.endContainer, 1 == d.nodeType ? ((c = d.childNodes[this.endOffset]) ? d.insertBefore(f, c) : d.appendChild(f), c = d = f) : c = d;;) {
                if (domUtils.isBlockElm(d)) {
                  for (d = c; (c = d.nextSibling) && !domUtils.isBlockElm(c);) d = c;
                  this.setEndAfter(d);
                  break
                }
                c = d,
                  d = d.parentNode
              }
              f.parentNode === this.endContainer && this.endOffset--,
                domUtils.remove(f)
            }
            if (!this.collapsed) {
              for (; ! (0 != this.startOffset || b && b(this.startContainer) || e(this.startContainer));) this.setStartBefore(this.startContainer);
              for (; ! (this.endOffset != (1 == this.endContainer.nodeType ? this.endContainer.childNodes.length: this.endContainer.nodeValue.length) || b && b(this.endContainer) || e(this.endContainer));) this.setEndAfter(this.endContainer)
            }
            return this
          },
          enlargeToBlockElm: function(a) {
            for (; ! domUtils.isBlockElm(this.startContainer);) this.setStartBefore(this.startContainer);
            if (!a) for (; ! domUtils.isBlockElm(this.endContainer);) this.setEndAfter(this.endContainer);
            return this
          },
          adjustmentBoundary: function() {
            if (!this.collapsed) {
              for (; ! domUtils.isBody(this.startContainer) && this.startOffset == this.startContainer[3 == this.startContainer.nodeType ? "nodeValue": "childNodes"].length && this.startContainer[3 == this.startContainer.nodeType ? "nodeValue": "childNodes"].length;) this.setStartAfter(this.startContainer);
              for (; ! domUtils.isBody(this.endContainer) && !this.endOffset && this.endContainer[3 == this.endContainer.nodeType ? "nodeValue": "childNodes"].length;) this.setEndBefore(this.endContainer)
            }
            return this
          },
          applyInlineStyle: function(a, b, c) {
            if (this.collapsed) return this;
            this.trimBoundary().enlarge(!1,
              function(a) {
                return 1 == a.nodeType && domUtils.isBlockElm(a)
              }).adjustmentBoundary();
            for (var d, e, f = this.createBookmark(), g = f.end, h = function(a) {
                return 1 == a.nodeType ? "br" != a.tagName.toLowerCase() : !domUtils.isWhitespace(a)
              },
                   i = domUtils.getNextDomNode(f.start, !1, h), j = this.cloneRange(); i && domUtils.getPosition(i, g) & domUtils.POSITION_PRECEDING;) if (3 == i.nodeType || dtd[a][i.tagName]) {
              for (j.setStartBefore(i), d = i; d && (3 == d.nodeType || dtd[a][d.tagName]) && d !== g;) e = d,
                d = domUtils.getNextDomNode(d, 1 == d.nodeType, null,
                  function(b) {
                    return dtd[a][b.tagName]
                  });
              var k, l = j.setEndAfter(e).extractContents();
              if (c && c.length > 0) {
                var m, n;
                n = m = c[0].cloneNode(!1);
                for (var o, p = 1; o = c[p++];) m.appendChild(o.cloneNode(!1)),
                  m = m.firstChild;
                k = m
              } else k = j.document.createElement(a);
              b && domUtils.setAttributes(k, b),
                k.appendChild(l),
                j.insertNode(c ? n: k);
              var q;
              if ("span" == a && b.style && /text\-decoration/.test(b.style) && (q = domUtils.findParentByTagName(k, "a", !0)) ? (domUtils.setAttributes(q, b), domUtils.remove(k, !0), k = q) : (domUtils.mergeSibling(k), domUtils.clearEmptySibling(k)), domUtils.mergeChild(k, b), i = domUtils.getNextDomNode(k, !1, h), domUtils.mergeToParent(k), d === g) break
            } else i = domUtils.getNextDomNode(i, !0, h);
            return this.moveToBookmark(f)
          },
          removeInlineStyle: function(a) {
            if (this.collapsed) return this;
            a = utils.isArray(a) ? a: [a],
              this.shrinkBoundary().adjustmentBoundary();
            for (var b = this.startContainer,
                   c = this.endContainer;;) {
              if (1 == b.nodeType) {
                if (utils.indexOf(a, b.tagName.toLowerCase()) > -1) break;
                if ("body" == b.tagName.toLowerCase()) {
                  b = null;
                  break
                }
              }
              b = b.parentNode
            }
            for (;;) {
              if (1 == c.nodeType) {
                if (utils.indexOf(a, c.tagName.toLowerCase()) > -1) break;
                if ("body" == c.tagName.toLowerCase()) {
                  c = null;
                  break
                }
              }
              c = c.parentNode
            }
            var d, e, f = this.createBookmark();
            b && (e = this.cloneRange().setEndBefore(f.start).setStartBefore(b), d = e.extractContents(), e.insertNode(d), domUtils.clearEmptySibling(b, !0), b.parentNode.insertBefore(f.start, b)),
            c && (e = this.cloneRange().setStartAfter(f.end).setEndAfter(c), d = e.extractContents(), e.insertNode(d), domUtils.clearEmptySibling(c, !1, !0), c.parentNode.insertBefore(f.end, c.nextSibling));
            for (var g, h = domUtils.getNextDomNode(f.start, !1,
              function(a) {
                return 1 == a.nodeType
              }); h && h !== f.end;) g = domUtils.getNextDomNode(h, !0,
              function(a) {
                return 1 == a.nodeType
              }),
            utils.indexOf(a, h.tagName.toLowerCase()) > -1 && domUtils.remove(h, !0),
              h = g;
            return this.moveToBookmark(f)
          },
          getClosedNode: function() {
            var a;
            if (!this.collapsed) {
              var c = this.cloneRange().adjustmentBoundary().shrinkBoundary();
              if (b(c)) {
                var d = c.startContainer.childNodes[c.startOffset];
                d && 1 == d.nodeType && (dtd.$empty[d.tagName] || dtd.$nonChild[d.tagName]) && (a = d)
              }
            }
            return a
          },
          select: browser.ie ?
            function(a, b) {
              var c;
              this.collapsed || this.shrinkBoundary();
              var d = this.getClosedNode();
              if (d && !b) {
                try {
                  c = this.document.body.createControlRange(),
                    c.addElement(d),
                    c.select()
                } catch(h) {}
                return this
              }
              var j, k = this.createBookmark(),
                l = k.start;
              if (c = this.document.body.createTextRange(), c.moveToElementText(l), c.moveStart("character", 1), this.collapsed) {
                if (!a && 3 != this.startContainer.nodeType) {
                  var m = this.document.createTextNode(i),
                    n = this.document.createElement("span");
                  n.appendChild(this.document.createTextNode(i)),
                    l.parentNode.insertBefore(n, l),
                    l.parentNode.insertBefore(m, l),
                    e(this.document, m),
                    g = m,
                    f(n, "previousSibling"),
                    f(l, "nextSibling"),
                    c.moveStart("character", -1),
                    c.collapse(!0)
                }
              } else {
                var o = this.document.body.createTextRange();
                j = k.end,
                  o.moveToElementText(j),
                  c.setEndPoint("EndToEnd", o)
              }
              this.moveToBookmark(k),
              n && domUtils.remove(n);
              try {
                c.select()
              } catch(h) {}
              return this
            }: function(a) {
              function b(a) {
                function b(b, c, d) {
                  3 == b.nodeType && b.nodeValue.length < c && (a[d + "Offset"] = b.nodeValue.length)
                }
                b(a.startContainer, a.startOffset, "start"),
                  b(a.endContainer, a.endOffset, "end")
              }
              var c, d = domUtils.getWindow(this.document),
                h = d.getSelection();
              if (browser.gecko ? this.document.body.focus() : d.focus(), h) {
                if (h.removeAllRanges(), this.collapsed && !a) {
                  var j = this.startContainer,
                    k = j;
                  1 == j.nodeType && (k = j.childNodes[this.startOffset]),
                  3 == j.nodeType && this.startOffset || (k ? k.previousSibling && 3 == k.previousSibling.nodeType: j.lastChild && 3 == j.lastChild.nodeType) || (c = this.document.createTextNode(i), this.insertNode(c), e(this.document, c), f(c, "previousSibling"), f(c, "nextSibling"), g = c, this.setStart(c, browser.webkit ? 1 : 0).collapse(!0))
                }
                var l = this.document.createRange();
                if (this.collapsed && browser.opera && 1 == this.startContainer.nodeType) {
                  var k = this.startContainer.childNodes[this.startOffset];
                  if (k) {
                    for (; k && domUtils.isBlockElm(k) && 1 == k.nodeType && k.childNodes[0];) k = k.childNodes[0];
                    k && this.setStartBefore(k).collapse(!0)
                  } else k = this.startContainer.lastChild,
                  k && domUtils.isBr(k) && this.setStartBefore(k).collapse(!0)
                }
                b(this),
                  l.setStart(this.startContainer, this.startOffset),
                  l.setEnd(this.endContainer, this.endOffset),
                  h.addRange(l)
              }
              return this
            },
          scrollToView: function(a, b) {
            a = a ? window: domUtils.getWindow(this.document);
            var c = this,
              d = c.document.createElement("span");
            return d.innerHTML = "&nbsp;",
              c.cloneRange().insertNode(d),
              domUtils.scrollToView(d, a, b),
              domUtils.remove(d),
              c
          },
          inFillChar: function() {
            var a = this.startContainer;
            return ! (!this.collapsed || 3 != a.nodeType || a.nodeValue.replace(new RegExp("^" + domUtils.fillChar), "").length + 1 != a.nodeValue.length)
          },
          createAddress: function(a, b) {
            function c(a) {
              for (var c, d = a ? e.startContainer: e.endContainer, f = domUtils.findParents(d, !0,
                function(a) {
                  return ! domUtils.isBody(a)
                }), g = [], h = 0; c = f[h++];) g.push(domUtils.getNodeIndex(c, b));
              var i = 0;
              if (b) if (3 == d.nodeType) {
                for (var j = d.previousSibling; j && 3 == j.nodeType;) i += j.nodeValue.replace(fillCharReg, "").length,
                  j = j.previousSibling;
                i += a ? e.startOffset: e.endOffset
              } else if (d = d.childNodes[a ? e.startOffset: e.endOffset]) i = domUtils.getNodeIndex(d, b);
              else {
                d = a ? e.startContainer: e.endContainer;
                for (var k = d.firstChild; k;) if (domUtils.isFillChar(k)) k = k.nextSibling;
                else if (i++, 3 == k.nodeType) for (; k && 3 == k.nodeType;) k = k.nextSibling;
                else k = k.nextSibling
              } else i = a ? domUtils.isFillChar(d) ? 0 : e.startOffset: e.endOffset;
              return i < 0 && (i = 0),
                g.push(i),
                g
            }
            var d = {},
              e = this;
            return d.startAddress = c(!0),
            a || (d.endAddress = e.collapsed ? [].concat(d.startAddress) : c()),
              d
          },
          moveToAddress: function(a, b) {
            function c(a, b) {
              for (var c, e, f, g = d.document.body,
                     h = 0,
                     i = a.length; h < i; h++) if (f = a[h], c = g, g = g.childNodes[f], !g) {
                e = f;
                break
              }
              b ? g ? d.setStartBefore(g) : d.setStart(c, e) : g ? d.setEndBefore(g) : d.setEnd(c, e)
            }
            var d = this;
            return c(a.startAddress, !0),
            !b && a.endAddress && c(a.endAddress),
              d
          },
          equals: function(a) {
            for (var b in this) if (this.hasOwnProperty(b) && this[b] !== a[b]) return ! 1;
            return ! 0
          },
          traversal: function(a, b) {
            if (this.collapsed) return this;
            for (var c = this.createBookmark(), d = c.end, e = domUtils.getNextDomNode(c.start, !1, b); e && e !== d && domUtils.getPosition(e, d) & domUtils.POSITION_PRECEDING;) {
              var f = domUtils.getNextDomNode(e, !1, b);
              a(e),
                e = f
            }
            return this.moveToBookmark(c)
          }
        }
      } (),
      function() {
        function a(a, b) {
          var c = domUtils.getNodeIndex;
          a = a.duplicate(),
            a.collapse(b);
          var d = a.parentElement();
          if (!d.hasChildNodes()) return {
            container: d,
            offset: 0
          };
          for (var e, f, g = d.children,
                 h = a.duplicate(), i = 0, j = g.length - 1, k = -1; i <= j;) {
            k = Math.floor((i + j) / 2),
              e = g[k],
              h.moveToElementText(e);
            var l = h.compareEndPoints("StartToStart", a);
            if (l > 0) j = k - 1;
            else {
              if (! (l < 0)) return {
                container: d,
                offset: c(e)
              };
              i = k + 1
            }
          }
          if (k == -1) {
            if (h.moveToElementText(d), h.setEndPoint("StartToStart", a), f = h.text.replace(/(\r\n|\r)/g, "\n").length, g = d.childNodes, !f) return e = g[g.length - 1],
              {
                container: e,
                offset: e.nodeValue.length
              };
            for (var m = g.length; f > 0;) f -= g[--m].nodeValue.length;
            return {
              container: g[m],
              offset: -f
            }
          }
          if (h.collapse(l > 0), h.setEndPoint(l > 0 ? "StartToStart": "EndToStart", a), f = h.text.replace(/(\r\n|\r)/g, "\n").length, !f) return dtd.$empty[e.tagName] || dtd.$nonChild[e.tagName] ? {
            container: d,
            offset: c(e) + (l > 0 ? 0 : 1)
          }: {
            container: e,
            offset: l > 0 ? 0 : e.childNodes.length
          };
          for (; f > 0;) try {
            var n = e;
            e = e[l > 0 ? "previousSibling": "nextSibling"],
              f -= e.nodeValue.length
          } catch(o) {
            return {
              container: d,
              offset: c(n)
            }
          }
          return {
            container: e,
            offset: l > 0 ? -f: e.nodeValue.length + f
          }
        }
        function b(b, c) {
          if (b.item) c.selectNode(b.item(0));
          else {
            var d = a(b, !0);
            c.setStart(d.container, d.offset),
            0 != b.compareEndPoints("StartToEnd", b) && (d = a(b, !1), c.setEnd(d.container, d.offset))
          }
          return c
        }
        function c(a) {
          var b;
          try {
            b = a.getNative().createRange()
          } catch(c) {
            return null
          }
          var d = b.item ? b.item(0) : b.parentElement();
          return (d.ownerDocument || d) === a.document ? b: null
        }
        var d = dom.Selection = function(a) {
          var b, d = this;
          d.document = a,
          browser.ie9below && (b = domUtils.getWindow(a).frameElement, domUtils.on(b, "beforedeactivate",
            function() {
              d._bakIERange = d.getIERange()
            }), domUtils.on(b, "activate",
            function() {
              try { ! c(d) && d._bakIERange && d._bakIERange.select()
              } catch(a) {}
              d._bakIERange = null
            })),
            b = a = null
        };
        d.prototype = {
          rangeInBody: function(a, b) {
            var c = browser.ie9below || b ? a.item ? a.item() : a.parentElement() : a.startContainer;
            return c === this.document.body || domUtils.inDoc(c, this.document)
          },
          getNative: function() {
            var a = this.document;
            try {
              return a ? browser.ie9below ? a.selection: domUtils.getWindow(a).getSelection() : null
            } catch(b) {
              return null
            }
          },
          getIERange: function() {
            var a = c(this);
            return ! a && this._bakIERange ? this._bakIERange: a
          },
          cache: function() {
            this.clear(),
              this._cachedRange = this.getRange(),
              this._cachedStartElement = this.getStart(),
              this._cachedStartElementPath = this.getStartElementPath()
          },
          getStartElementPath: function() {
            if (this._cachedStartElementPath) return this._cachedStartElementPath;
            var a = this.getStart();
            return a ? domUtils.findParents(a, !0, null, !0) : []
          },
          clear: function() {
            this._cachedStartElementPath = this._cachedRange = this._cachedStartElement = null
          },
          isFocus: function() {
            try {
              if (browser.ie9below) {
                var a = c(this);
                return ! (!a || !this.rangeInBody(a))
              }
              return !! this.getNative().rangeCount
            } catch(b) {
              return ! 1
            }
          },
          getRange: function() {
            function a(a) {
              for (var b = c.document.body.firstChild,
                     d = a.collapsed; b && b.firstChild;) a.setStart(b, 0),
                b = b.firstChild;
              a.startContainer || a.setStart(c.document.body, 0),
              d && a.collapse(!0)
            }
            var c = this;
            if (null != c._cachedRange) return this._cachedRange;
            var d = new baidu.editor.dom.Range(c.document);
            if (browser.ie9below) {
              var e = c.getIERange();
              if (e) try {
                b(e, d)
              } catch(f) {
                a(d)
              } else a(d)
            } else {
              var g = c.getNative();
              if (g && g.rangeCount) {
                var h = g.getRangeAt(0),
                  i = g.getRangeAt(g.rangeCount - 1);
                d.setStart(h.startContainer, h.startOffset).setEnd(i.endContainer, i.endOffset),
                d.collapsed && domUtils.isBody(d.startContainer) && !d.startOffset && a(d)
              } else {
                if (this._bakRange && domUtils.inDoc(this._bakRange.startContainer, this.document)) return this._bakRange;
                a(d)
              }
            }
            return this._bakRange = d
          },
          getStart: function() {
            if (this._cachedStartElement) return this._cachedStartElement;
            var a, b, c, d, e = browser.ie9below ? this.getIERange() : this.getRange();
            if (browser.ie9below) {
              if (!e) return this.document.body.firstChild;
              if (e.item) return e.item(0);
              for (a = e.duplicate(), a.text.length > 0 && a.moveStart("character", 1), a.collapse(1), b = a.parentElement(), d = c = e.parentElement(); c = c.parentNode;) if (c == b) {
                b = d;
                break
              }
            } else if (e.shrinkBoundary(), b = e.startContainer, 1 == b.nodeType && b.hasChildNodes() && (b = b.childNodes[Math.min(b.childNodes.length - 1, e.startOffset)]), 3 == b.nodeType) return b.parentNode;
            return b
          },
          getText: function() {
            var a, b;
            return this.isFocus() && (a = this.getNative()) ? (b = browser.ie9below ? a.createRange() : a.getRangeAt(0), browser.ie9below ? b.text: b.toString()) : ""
          },
          clearRange: function() {
            this.getNative()[browser.ie9below ? "empty": "removeAllRanges"]()
          }
        }
      } (),
      function() {
        function a(a, b) {
          var c;
          if (b.textarea) if (utils.isString(b.textarea)) {
            for (var d, e = 0,
                   f = domUtils.getElementsByTagName(a, "textarea"); d = f[e++];) if (d.id == "ueditor_textarea_" + b.options.textarea) {
              c = d;
              break
            }
          } else c = b.textarea;
          c || (a.appendChild(c = domUtils.createElement(document, "textarea", {
            name: b.options.textarea,
            id: "ueditor_textarea_" + b.options.textarea,
            style: "display:none"
          })), b.textarea = c),
          !c.getAttribute("name") && c.setAttribute("name", b.options.textarea),
            c.value = b.hasContents() ? b.options.allHtmlEnabled ? b.getAllHtml() : b.getContent(null, null, !0) : ""
        }
        function b(a) {
          for (var b in a) return b
        }
        function c(a) {
          a.langIsReady = !0,
            a.fireEvent("langReady")
        }
        var d, e = 0,
          f = UE.Editor = function(a) {
            var d = this;
            d.uid = e++,
              EventBase.call(d),
              d.commands = {},
              d.options = utils.extend(utils.clone(a || {}), UEDITOR_CONFIG, !0),
              d.shortcutkeys = {},
              d.inputRules = [],
              d.outputRules = [],
              d.setOpt(f.defaultOptions(d)),
              d.loadServerConfig(),
              utils.isEmptyObject(UE.I18N) ? utils.loadFile(document, {
                  src: d.options.langPath + d.options.lang + "/" + d.options.lang + ".js",
                  tag: "script",
                  type: "text/javascript",
                  defer: "defer"
                },
                function() {
                  UE.plugin.load(d),
                    c(d)
                }) : (d.options.lang = b(UE.I18N), UE.plugin.load(d), c(d)),
              UE.instants["ueditorInstant" + d.uid] = d
          };
        f.prototype = {
          registerCommand: function(a, b) {
            this.commands[a] = b
          },
          ready: function(a) {
            var b = this;
            a && (b.isReady ? a.apply(b) : b.addListener("ready", a))
          },
          setOpt: function(a, b) {
            var c = {};
            utils.isString(a) ? c[a] = b: c = a,
              utils.extend(this.options, c, !0)
          },
          getOpt: function(a) {
            return this.options[a]
          },
          destroy: function() {
            var a = this;
            a.fireEvent("destroy");
            var b = a.container.parentNode,
              c = a.textarea;
            c ? c.style.display = "": (c = document.createElement("textarea"), b.parentNode.insertBefore(c, b)),
              c.style.width = a.iframe.offsetWidth + "px",
              c.style.height = a.iframe.offsetHeight + "px",
              c.value = a.getContent(),
              c.id = a.key,
              b.innerHTML = "",
              domUtils.remove(b);
            var d = a.key;
            for (var e in a) a.hasOwnProperty(e) && delete this[e];
            UE.delEditor(d)
          },
          render: function(a) {
            var b = this,
              c = b.options,
              d = function(b) {
                return parseInt(domUtils.getComputedStyle(a, b))
              };
            if (utils.isString(a) && (a = document.getElementById(a)), a) {
              c.initialFrameWidth ? c.minFrameWidth = c.initialFrameWidth: c.minFrameWidth = c.initialFrameWidth = a.offsetWidth,
                c.initialFrameHeight ? c.minFrameHeight = c.initialFrameHeight: c.initialFrameHeight = c.minFrameHeight = a.offsetHeight,
                a.style.width = /%$/.test(c.initialFrameWidth) ? "100%": c.initialFrameWidth - d("padding-left") - d("padding-right") + "px",
                a.style.height = /%$/.test(c.initialFrameHeight) ? "100%": c.initialFrameHeight - d("padding-top") - d("padding-bottom") + "px",
                a.style.zIndex = c.zIndex;
              var e = (ie && browser.version < 9 ? "": "<!DOCTYPE html>") + "<html xmlns='http://www.w3.org/1999/xhtml' class='view' ><head><style type='text/css'>.view{padding:0;word-wrap:break-word;cursor:text;height:90%;}\nbody{margin:8px;font-family:sans-serif;font-size:16px;}p{margin:5px 0;}</style>" + (c.iframeCssUrl ? "<link rel='stylesheet' type='text/css' href='" + utils.unhtml(c.iframeCssUrl) + "'/>": "") + (c.initialStyle ? "<style>" + c.initialStyle + "</style>": "") + "</head><body class='view' ></body><script type='text/javascript' " + (ie ? "defer='defer'": "") + " id='_initialScript'>setTimeout(function(){editor = window.parent.UE.instants['ueditorInstant" + b.uid + "'];editor._setup(document);},0);var _tmpScript = document.getElementById('_initialScript');_tmpScript.parentNode.removeChild(_tmpScript);</script></html>";
              a.appendChild(domUtils.createElement(document, "iframe", {
                id: "ueditor_" + b.uid,
                width: "100%",
                height: "100%",
                frameborder: "0",
                src: "javascript:void(function(){document.open();" + (c.customDomain && document.domain != location.hostname ? 'document.domain="' + document.domain + '";': "") + 'document.write("' + e + '");document.close();}())'
              })),
                a.style.overflow = "hidden",
                setTimeout(function() { / %$ / .test(c.initialFrameWidth) && (c.minFrameWidth = c.initialFrameWidth = a.offsetWidth),
                /%$/.test(c.initialFrameHeight) && (c.minFrameHeight = c.initialFrameHeight = a.offsetHeight, a.style.height = c.initialFrameHeight + "px")
                })
            }
          },
          _setup: function(b) {
            var c = this,
              d = c.options;
            ie ? (b.body.disabled = !0, b.body.contentEditable = !0, b.body.disabled = !1) : b.body.contentEditable = !0,
              b.body.spellcheck = !1,
              c.document = b,
              c.window = b.defaultView || b.parentWindow,
              c.iframe = c.window.frameElement,
              c.body = b.body,
              c.selection = new dom.Selection(b);
            var e;
            browser.gecko && (e = this.selection.getNative()) && e.removeAllRanges(),
              this._initEvents();
            for (var f = this.iframe.parentNode; ! domUtils.isBody(f); f = f.parentNode) if ("FORM" == f.tagName) {
              c.form = f,
                c.options.autoSyncData ? domUtils.on(c.window, "blur",
                  function() {
                    a(f, c)
                  }) : domUtils.on(f, "submit",
                  function() {
                    a(this, c)
                  });
              break
            }
            if (d.initialContent) if (d.autoClearinitialContent) {
              var g = c.execCommand;
              c.execCommand = function() {
                return c.fireEvent("firstBeforeExecCommand"),
                  g.apply(c, arguments)
              },
                this._setDefaultContent(d.initialContent)
            } else this.setContent(d.initialContent, !1, !0);
            domUtils.isEmptyNode(c.body) && (c.body.innerHTML = "<p>" + (browser.ie ? "": "<br/>") + "</p>"),
            d.focus && setTimeout(function() {
                c.focus(c.options.focusInEnd),
                !c.options.autoClearinitialContent && c._selectionChange()
              },
              0),
            c.container || (c.container = this.iframe.parentNode),
            d.fullscreen && c.ui && c.ui.setFullScreen(!0);
            try {
              c.document.execCommand("2D-position", !1, !1)
            } catch(h) {}
            try {
              c.document.execCommand("enableInlineTableEditing", !1, !1)
            } catch(h) {}
            try {
              c.document.execCommand("enableObjectResizing", !1, !1)
            } catch(h) {}
            c._bindshortcutKeys(),
              c.isReady = 1,
              c.fireEvent("ready"),
            d.onready && d.onready.call(c),
            browser.ie9below || domUtils.on(c.window, ["blur", "focus"],
              function(a) {
                if ("blur" == a.type) {
                  c._bakRange = c.selection.getRange();
                  try {
                    c._bakNativeRange = c.selection.getNative().getRangeAt(0),
                      c.selection.getNative().removeAllRanges()
                  } catch(a) {
                    c._bakNativeRange = null
                  }
                } else try {
                  c._bakRange && c._bakRange.select()
                } catch(a) {}
              }),
            browser.gecko && browser.version <= 10902 && (c.body.contentEditable = !1, setTimeout(function() {
                c.body.contentEditable = !0
              },
              100), setInterval(function() {
                c.body.style.height = c.iframe.offsetHeight - 20 + "px"
              },
              100)),
            !d.isShow && c.setHide(),
            d.readonly && c.setDisabled()
          },
          sync: function(b) {
            var c = this,
              d = b ? document.getElementById(b) : domUtils.findParent(c.iframe.parentNode,
                function(a) {
                  return "FORM" == a.tagName
                },
                !0);
            d && a(d, c)
          },
          setHeight: function(a, b) {
            a !== parseInt(this.iframe.parentNode.style.height) && (this.iframe.parentNode.style.height = a + "px"),
            !b && (this.options.minFrameHeight = this.options.initialFrameHeight = a),
              this.body.style.height = a + "px",
            !b && this.trigger("setHeight")
          },
          addshortcutkey: function(a, b) {
            var c = {};
            b ? c[a] = b: c = a,
              utils.extend(this.shortcutkeys, c)
          },
          _bindshortcutKeys: function() {
            var a = this,
              b = this.shortcutkeys;
            a.addListener("keydown",
              function(c, d) {
                var e = d.keyCode || d.which;
                for (var f in b) for (var g, h = b[f].split(","), i = 0; g = h[i++];) {
                  g = g.split(":");
                  var j = g[0],
                    k = g[1]; (/^(ctrl)(\+shift)?\+(\d+)$/.test(j.toLowerCase()) || /^(\d+)$/.test(j)) && (("ctrl" == RegExp.$1 ? d.ctrlKey || d.metaKey: 0) && ("" != RegExp.$2 ? d[RegExp.$2.slice(1) + "Key"] : 1) && e == RegExp.$3 || e == RegExp.$1) && (a.queryCommandState(f, k) != -1 && a.execCommand(f, k), domUtils.preventDefault(d))
                }
              })
          },
          getContent: function(a, b, c, d, e) {
            var f = this;
            if (a && utils.isFunction(a) && (b = a, a = ""), b ? !b() : !this.hasContents()) return "";
            f.fireEvent("beforegetcontent");
            var g = UE.htmlparser(f.body.innerHTML, d);
            return f.filterOutputRule(g),
              f.fireEvent("aftergetcontent", a, g),
              g.toHtml(e)
          },
          getAllHtml: function() {
            var a = this,
              b = [];
            if (a.fireEvent("getAllHtml", b), browser.ie && browser.version > 8) {
              var c = "";
              utils.each(a.document.styleSheets,
                function(a) {
                  c += a.href ? '<link rel="stylesheet" type="text/css" href="' + a.href + '" />': "<style>" + a.cssText + "</style>"
                }),
                utils.each(a.document.getElementsByTagName("script"),
                  function(a) {
                    c += a.outerHTML
                  })
            }
            return "<html><head>" + (a.options.charset ? '<meta http-equiv="Content-Type" content="text/html; charset=' + a.options.charset + '"/>': "") + (c || a.document.getElementsByTagName("head")[0].innerHTML) + b.join("\n") + "</head><body " + (ie && browser.version < 9 ? 'class="view"': "") + ">" + a.getContent(null, null, !0) + "</body></html>"
          },
          getPlainTxt: function() {
            var a = new RegExp(domUtils.fillChar, "g"),
              b = this.body.innerHTML.replace(/[\n\r]/g, "");
            return b = b.replace(/<(p|div)[^>]*>(<br\/?>|&nbsp;)<\/\1>/gi, "\n").replace(/<br\/?>/gi, "\n").replace(/<[^>\/]+>/g, "").replace(/(\n)?<\/([^>]+)>/g,
              function(a, b, c) {
                return dtd.$block[c] ? "\n": b ? b: ""
              }),
              b.replace(a, "").replace(/\u00a0/g, " ").replace(/&nbsp;/g, " ")
          },
          getContentTxt: function() {
            var a = new RegExp(domUtils.fillChar, "g");
            return this.body[browser.ie ? "innerText": "textContent"].replace(a, "").replace(/\u00a0/g, " ")
          },
          setContent: function(b, c, d) {
            function e(a) {
              return "DIV" == a.tagName && a.getAttribute("cdata_tag")
            }
            var f = this;
            f.fireEvent("beforesetcontent", b);
            var g = UE.htmlparser(b);
            if (f.filterInputRule(g), b = g.toHtml(), f.body.innerHTML = (c ? f.body.innerHTML: "") + b, "p" == f.options.enterTag) {
              var h, i = this.body.firstChild;
              if (!i || 1 == i.nodeType && (dtd.$cdata[i.tagName] || e(i) || domUtils.isCustomeNode(i)) && i === this.body.lastChild) this.body.innerHTML = "<p>" + (browser.ie ? "&nbsp;": "<br/>") + "</p>" + this.body.innerHTML;
              else for (var j = f.document.createElement("p"); i;) {
                for (; i && (3 == i.nodeType || 1 == i.nodeType && dtd.p[i.tagName] && !dtd.$cdata[i.tagName]);) h = i.nextSibling,
                  j.appendChild(i),
                  i = h;
                if (j.firstChild) {
                  if (!i) {
                    f.body.appendChild(j);
                    break
                  }
                  i.parentNode.insertBefore(j, i),
                    j = f.document.createElement("p")
                }
                i = i.nextSibling
              }
            }
            f.fireEvent("aftersetcontent"),
              f.fireEvent("contentchange"),
            !d && f._selectionChange(),
              f._bakRange = f._bakIERange = f._bakNativeRange = null;
            var k;
            browser.gecko && (k = this.selection.getNative()) && k.removeAllRanges(),
            f.options.autoSyncData && f.form && a(f.form, f)
          },
          focus: function(a) {
            try {
              var b = this,
                c = b.selection.getRange();
              if (a) {
                var d = b.body.lastChild;
                d && 1 == d.nodeType && !dtd.$empty[d.tagName] && (domUtils.isEmptyBlock(d) ? c.setStartAtFirst(d) : c.setStartAtLast(d), c.collapse(!0)),
                  c.setCursor(!0)
              } else {
                if (!c.collapsed && domUtils.isBody(c.startContainer) && 0 == c.startOffset) {
                  var d = b.body.firstChild;
                  d && 1 == d.nodeType && !dtd.$empty[d.tagName] && c.setStartAtFirst(d).collapse(!0)
                }
                c.select(!0)
              }
              this.fireEvent("focus selectionchange")
            } catch(e) {}
          },
          isFocus: function() {
            return this.selection.isFocus()
          },
          blur: function() {
            var a = this.selection.getNative();
            if (a.empty && browser.ie) {
              var b = document.body.createTextRange();
              b.moveToElementText(document.body),
                b.collapse(!0),
                b.select(),
                a.empty()
            } else a.removeAllRanges()
          },
          _initEvents: function() {
            var a = this,
              b = a.document,
              c = a.window;
            a._proxyDomEvent = utils.bind(a._proxyDomEvent, a),
              domUtils.on(b, ["click", "contextmenu", "mousedown", "keydown", "keyup", "keypress", "mouseup", "mouseover", "mouseout", "selectstart"], a._proxyDomEvent),
              domUtils.on(c, ["focus", "blur"], a._proxyDomEvent),
              domUtils.on(a.body, "drop",
                function(b) {
                  browser.gecko && b.stopPropagation && b.stopPropagation(),
                    a.fireEvent("contentchange")
                }),
              domUtils.on(b, ["mouseup", "keydown"],
                function(b) {
                  "keydown" == b.type && (b.ctrlKey || b.metaKey || b.shiftKey || b.altKey) || 2 != b.button && a._selectionChange(250, b)
                })
          },
          _proxyDomEvent: function(a) {
            return this.fireEvent("before" + a.type.replace(/^on/, "").toLowerCase()) !== !1 && (this.fireEvent(a.type.replace(/^on/, ""), a) !== !1 && this.fireEvent("after" + a.type.replace(/^on/, "").toLowerCase()))
          },
          _selectionChange: function(a, b) {
            var c, e, f = this,
              g = !1;
            if (browser.ie && browser.version < 9 && b && "mouseup" == b.type) {
              var h = this.selection.getRange();
              h.collapsed || (g = !0, c = b.clientX, e = b.clientY)
            }
            clearTimeout(d),
              d = setTimeout(function() {
                  if (f.selection && f.selection.getNative()) {
                    var a;
                    if (g && "None" == f.selection.getNative().type) {
                      a = f.document.body.createTextRange();
                      try {
                        a.moveToPoint(c, e)
                      } catch(d) {
                        a = null
                      }
                    }
                    var h;
                    a && (h = f.selection.getIERange, f.selection.getIERange = function() {
                      return a
                    }),
                      f.selection.cache(),
                    h && (f.selection.getIERange = h),
                    f.selection._cachedRange && f.selection._cachedStartElement && (f.fireEvent("beforeselectionchange"), f.fireEvent("selectionchange", !!b), f.fireEvent("afterselectionchange"), f.selection.clear())
                  }
                },
                a || 50)
          },
          _callCmdFn: function(a, b) {
            var c, d, e = b[0].toLowerCase();
            return c = this.commands[e] || UE.commands[e],
              d = c && c[a],
              c && d || "queryCommandState" != a ? d ? d.apply(this, b) : void 0 : 0
          },
          execCommand: function(a) {
            a = a.toLowerCase();
            var b, c = this,
              d = c.commands[a] || UE.commands[a];
            return d && d.execCommand ? (d.notNeedUndo || c.__hasEnterExecCommand ? (b = this._callCmdFn("execCommand", arguments), !c.__hasEnterExecCommand && !d.ignoreContentChange && !c._ignoreContentChange && c.fireEvent("contentchange")) : (c.__hasEnterExecCommand = !0, c.queryCommandState.apply(c, arguments) != -1 && (c.fireEvent("saveScene"), c.fireEvent.apply(c, ["beforeexeccommand", a].concat(arguments)), b = this._callCmdFn("execCommand", arguments), c.fireEvent.apply(c, ["afterexeccommand", a].concat(arguments)), c.fireEvent("saveScene")), c.__hasEnterExecCommand = !1), !c.__hasEnterExecCommand && !d.ignoreContentChange && !c._ignoreContentChange && c._selectionChange(), b) : null
          },
          queryCommandState: function(a) {
            return this._callCmdFn("queryCommandState", arguments)
          },
          queryCommandValue: function(a) {
            return this._callCmdFn("queryCommandValue", arguments)
          },
          hasContents: function(a) {
            if (a) for (var b, c = 0; b = a[c++];) if (this.document.getElementsByTagName(b).length > 0) return ! 0;
            if (!domUtils.isEmptyBlock(this.body)) return ! 0;
            for (a = ["div"], c = 0; b = a[c++];) for (var d, e = domUtils.getElementsByTagName(this.document, b), f = 0; d = e[f++];) if (domUtils.isCustomeNode(d)) return ! 0;
            return ! 1
          },
          reset: function() {
            this.fireEvent("reset")
          },
          setEnabled: function() {
            var a, b = this;
            if ("false" == b.body.contentEditable) {
              b.body.contentEditable = !0,
                a = b.selection.getRange();
              try {
                a.moveToBookmark(b.lastBk),
                  delete b.lastBk
              } catch(c) {
                a.setStartAtFirst(b.body).collapse(!0)
              }
              a.select(!0),
              b.bkqueryCommandState && (b.queryCommandState = b.bkqueryCommandState, delete b.bkqueryCommandState),
              b.bkqueryCommandValue && (b.queryCommandValue = b.bkqueryCommandValue, delete b.bkqueryCommandValue),
                b.fireEvent("selectionchange")
            }
          },
          enable: function() {
            return this.setEnabled()
          },
          setDisabled: function(a) {
            var b = this;
            a = a ? utils.isArray(a) ? a: [a] : [],
            "true" == b.body.contentEditable && (b.lastBk || (b.lastBk = b.selection.getRange().createBookmark(!0)), b.body.contentEditable = !1, b.bkqueryCommandState = b.queryCommandState, b.bkqueryCommandValue = b.queryCommandValue, b.queryCommandState = function(c) {
              return utils.indexOf(a, c) != -1 ? b.bkqueryCommandState.apply(b, arguments) : -1
            },
              b.queryCommandValue = function(c) {
                return utils.indexOf(a, c) != -1 ? b.bkqueryCommandValue.apply(b, arguments) : null
              },
              b.fireEvent("selectionchange"))
          },
          disable: function(a) {
            return this.setDisabled(a)
          },
          _setDefaultContent: function() {
            function a() {
              var b = this;
              b.document.getElementById("initContent") && (b.body.innerHTML = "<p>" + (ie ? "": "<br/>") + "</p>", b.removeListener("firstBeforeExecCommand focus", a), setTimeout(function() {
                  b.focus(),
                    b._selectionChange()
                },
                0))
            }
            return function(b) {
              var c = this;
              c.body.innerHTML = '<p id="initContent">' + b + "</p>",
                c.addListener("firstBeforeExecCommand focus", a)
            }
          } (),
          setShow: function() {
            var a = this,
              b = a.selection.getRange();
            if ("none" == a.container.style.display) {
              try {
                b.moveToBookmark(a.lastBk),
                  delete a.lastBk
              } catch(c) {
                b.setStartAtFirst(a.body).collapse(!0)
              }
              setTimeout(function() {
                  b.select(!0)
                },
                100),
                a.container.style.display = ""
            }
          },
          show: function() {
            return this.setShow()
          },
          setHide: function() {
            var a = this;
            a.lastBk || (a.lastBk = a.selection.getRange().createBookmark(!0)),
              a.container.style.display = "none"
          },
          hide: function() {
            return this.setHide()
          },
          getLang: function(a) {
            var b = UE.I18N[this.options.lang];
            if (!b) throw Error("not import language file");
            a = (a || "").split(".");
            for (var c, d = 0; (c = a[d++]) && (b = b[c], b););
            return b
          },
          getContentLength: function(a, b) {
            var c = this.getContent(!1, !1, !0).length;
            if (a) {
              b = (b || []).concat(["hr", "img", "iframe"]),
                c = this.getContentTxt().replace(/[\t\r\n]+/g, "").length;
              for (var d, e = 0; d = b[e++];) c += this.document.getElementsByTagName(d).length
            }
            return c
          },
          addInputRule: function(a) {
            this.inputRules.push(a)
          },
          filterInputRule: function(a) {
            for (var b, c = 0; b = this.inputRules[c++];) b.call(this, a)
          },
          addOutputRule: function(a) {
            this.outputRules.push(a)
          },
          filterOutputRule: function(a) {
            for (var b, c = 0; b = this.outputRules[c++];) b.call(this, a)
          },
          getActionUrl: function(a) {
            var b = this.getOpt(a) || a,
              c = this.getOpt("imageUrl"),
              d = this.getOpt("serverUrl");
            return ! d && c && (d = c.replace(/^(.*[\/]).+([\.].+)$/, "$1controller$2")),
              d ? (d = d + (d.indexOf("?") == -1 ? "?": "&") + "action=" + (b || ""), utils.formatUrl(d)) : ""
          }
        },
          utils.inherits(f, EventBase)
      } (),
      UE.Editor.defaultOptions = function(a) {
        var b = a.options.UEDITOR_HOME_URL;
        return {
          isShow: !0,
          initialContent: "",
          initialStyle: "",
          autoClearinitialContent: !1,
          iframeCssUrl: b + "themes/iframe.css",
          textarea: "editorValue",
          focus: !1,
          focusInEnd: !0,
          autoClearEmptyNode: !0,
          fullscreen: !1,
          readonly: !1,
          zIndex: 999,
          imagePopup: !0,
          enterTag: "p",
          customDomain: !1,
          lang: "zh-cn",
          langPath: b + "lang/",
          theme: "default",
          themePath: b + "themes/",
          allHtmlEnabled: !1,
          scaleEnabled: !1,
          tableNativeEditInFF: !1,
          autoSyncData: !0,
          fileNameFormat: "{time}{rand:6}"
        }
      },
      function() {
        UE.Editor.prototype.loadServerConfig = function() {
          function showErrorMsg(a) {
            console && console.error(a)
          }
          var me = this;
          setTimeout(function() {
            try {
              me.options.imageUrl && me.setOpt("serverUrl", me.options.imageUrl.replace(/^(.*[\/]).+([\.].+)$/, "$1controller$2"));
              var configUrl = me.getActionUrl("config"),
                isJsonp = utils.isCrossDomainUrl(configUrl);
              me._serverConfigLoaded = !1,
              configUrl && UE.ajax.request(configUrl, {
                method: "GET",
                dataType: isJsonp ? "jsonp": "",
                onsuccess: function(r) {
                  try {
                    var config = isJsonp ? r: eval("(" + r.responseText + ")");
                    utils.extend(me.options, config),
                      me.fireEvent("serverConfigLoaded"),
                      me._serverConfigLoaded = !0
                  } catch(e) {
                    showErrorMsg(me.getLang("loadconfigFormatError"))
                  }
                },
                onerror: function() {
                  showErrorMsg(me.getLang("loadconfigHttpError"))
                }
              })
            } catch(e) {
              showErrorMsg(me.getLang("loadconfigError"))
            }
          })
        },
          UE.Editor.prototype.isServerConfigLoaded = function() {
            var a = this;
            return a._serverConfigLoaded || !1
          },
          UE.Editor.prototype.afterConfigReady = function(a) {
            if (a && utils.isFunction(a)) {
              var b = this,
                c = function() {
                  a.apply(b, arguments),
                    b.removeListener("serverConfigLoaded", c)
                };
              b.isServerConfigLoaded() ? a.call(b, "serverConfigLoaded") : b.addListener("serverConfigLoaded", c)
            }
          }
      } (),
      UE.ajax = function() {
        function a(a) {
          var b = [];
          for (var c in a) if ("method" != c && "timeout" != c && "async" != c && "dataType" != c && "callback" != c && void 0 != a[c] && null != a[c]) if ("function" != (typeof a[c]).toLowerCase() && "object" != (typeof a[c]).toLowerCase()) b.push(encodeURIComponent(c) + "=" + encodeURIComponent(a[c]));
          else if (utils.isArray(a[c])) for (var d = 0; d < a[c].length; d++) b.push(encodeURIComponent(c) + "[]=" + encodeURIComponent(a[c][d]));
          return b.join("&")
        }
        function b(b, c) {
          var d = f(),
            e = !1,
            g = {
              method: "POST",
              timeout: 5e3,
              async: !0,
              data: {},
              onsuccess: function() {},
              onerror: function() {}
            };
          if ("object" == typeof b && (c = b, b = c.url), d && b) {
            var h = c ? utils.extend(g, c) : g,
              i = a(h);
            utils.isEmptyObject(h.data) || (i += (i ? "&": "") + a(h.data));
            var j = setTimeout(function() {
                4 != d.readyState && (e = !0, d.abort(), clearTimeout(j))
              },
              h.timeout),
              k = h.method.toUpperCase(),
              l = b + (b.indexOf("?") == -1 ? "?": "&") + ("POST" == k ? "": i + "&noCache=" + +new Date);
            d.open(k, l, h.async),
              d.onreadystatechange = function() {
                4 == d.readyState && (e || 200 != d.status ? h.onerror(d) : h.onsuccess(d))
              },
              "POST" == k ? (d.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"), d.send(i)) : d.send(null)
          }
        }
        function c(b, c) {
          function d(a, b, c) {
            a.setAttribute("type", "text/javascript"),
              a.setAttribute("defer", "defer"),
            c && a.setAttribute("charset", c),
              a.setAttribute("src", b),
              document.getElementsByTagName("head")[0].appendChild(a)
          }
          function e(a) {
            return function() {
              try {
                if (a) k.onerror && k.onerror();
                else try {
                  clearTimeout(g),
                    i.apply(window, arguments)
                } catch(b) {}
              } catch(c) {
                k.onerror && k.onerror.call(window, c)
              } finally {
                k.oncomplete && k.oncomplete.apply(window, arguments),
                j.parentNode && j.parentNode.removeChild(j),
                  window[f] = null;
                try {
                  delete window[f]
                } catch(b) {}
              }
            }
          }
          var f, g, h, i = c.onsuccess ||
            function() {},
            j = document.createElement("SCRIPT"),
            k = c || {},
            l = k.charset,
            m = k.jsonp || "callback",
            n = k.timeOut || 0,
            o = new RegExp("(\\?|&)" + m + "=([^&]*)");
          utils.isFunction(i) ? (f = "bd__editor__" + Math.floor(2147483648 * Math.random()).toString(36), window[f] = e(0)) : utils.isString(i) ? f = i: (h = o.exec(b)) && (f = h[2]),
            b = b.replace(o, "$1" + m + "=" + f),
          b.search(o) < 0 && (b += (b.indexOf("?") < 0 ? "?": "&") + m + "=" + f);
          var p = a(c);
          utils.isEmptyObject(c.data) || (p += (p ? "&": "") + a(c.data)),
          p && (b = b.replace(/\?/, "?" + p + "&")),
            j.onerror = e(1),
          n && (g = setTimeout(e(1), n)),
            d(j, b, l)
        }
        var d = "XMLHttpRequest()";
        try {
          new ActiveXObject("Msxml2.XMLHTTP"),
            d = "ActiveXObject('Msxml2.XMLHTTP')"
        } catch(e) {
          try {
            new ActiveXObject("Microsoft.XMLHTTP"),
              d = "ActiveXObject('Microsoft.XMLHTTP')"
          } catch(e) {}
        }
        var f = new Function("return new " + d);
        return {
          request: function(a, d) {
            d && "jsonp" == d.dataType ? c(a, d) : b(a, d)
          },
          getJSONP: function(a, b, d) {
            var e = {
              data: b,
              oncomplete: d
            };
            c(a, e)
          }
        }
      } ();
    var filterWord = UE.filterWord = function() {
      function a(a) {
        return /(class="?Mso|style="[^"]*\bmso\-|w:WordDocument|<(v|o):|lang=)/gi.test(a)
      }
      function b(a) {
        return a = a.replace(/[\d.]+\w+/g,
          function(a) {
            return utils.transUnitToPx(a)
          })
      }
      function c(a) {
        return a.replace(/[\t\r\n]+/g, " ").replace(/<!--[\s\S]*?-->/gi, "").replace(/<v:shape [^>]*>[\s\S]*?.<\/v:shape>/gi,
          function(a) {
            if (browser.opera) return "";
            try {
              if (/Bitmap/i.test(a)) return "";
              var c = a.match(/width:([ \d.]*p[tx])/i)[1],
                d = a.match(/height:([ \d.]*p[tx])/i)[1],
                e = a.match(/src=\s*"([^"]*)"/i)[1];
              return '<img width="' + b(c) + '" height="' + b(d) + '" src="' + e + '" />'
            } catch(f) {
              return ""
            }
          }).replace(/<\/?div[^>]*>/g, "").replace(/v:\w+=(["']?)[^'"]+\1/g, "").replace(/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|xml|meta|link|style|\w+:\w+)(?=[\s\/>]))[^>]*>/gi, "").replace(/<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi, "<p><strong>$1</strong></p>").replace(/\s+(class|lang|align)\s*=\s*(['"]?)([\w-]+)\2/gi,
          function(a, b, c, d) {
            return "class" == b && "MsoListParagraph" == d ? a: ""
          }).replace(/<(font|span)[^>]*>(\s*)<\/\1>/gi,
          function(a, b, c) {
            return c.replace(/[\t\r\n ]+/g, " ")
          }).replace(/(<[a-z][^>]*)\sstyle=(["'])([^\2]*?)\2/gi,
          function(a, c, d, e) {
            for (var f, g = [], h = e.replace(/^\s+|\s+$/, "").replace(/&#39;/g, "'").replace(/&quot;/gi, "'").replace(/[\d.]+(cm|pt)/g,
              function(a) {
                return utils.transUnitToPx(a)
              }).split(/;\s*/g), i = 0; f = h[i]; i++) {
              var j, k, l = f.split(":");
              if (2 == l.length) {
                if (j = l[0].toLowerCase(), k = l[1].toLowerCase(), /^(background)\w*/.test(j) && 0 == k.replace(/(initial|\s)/g, "").length || /^(margin)\w*/.test(j) && /^0\w+$/.test(k)) continue;
                switch (j) {
                  case "mso-padding-alt":
                  case "mso-padding-top-alt":
                  case "mso-padding-right-alt":
                  case "mso-padding-bottom-alt":
                  case "mso-padding-left-alt":
                  case "mso-margin-alt":
                  case "mso-margin-top-alt":
                  case "mso-margin-right-alt":
                  case "mso-margin-bottom-alt":
                  case "mso-margin-left-alt":
                  case "mso-height":
                  case "mso-width":
                  case "mso-vertical-align-alt":
                    /<table/.test(c) || (g[i] = j.replace(/^mso-|-alt$/g, "") + ":" + b(k));
                    continue;
                  case "horiz-align":
                    g[i] = "text-align:" + k;
                    continue;
                  case "vert-align":
                    g[i] = "vertical-align:" + k;
                    continue;
                  case "font-color":
                  case "mso-foreground":
                    g[i] = "color:" + k;
                    continue;
                  case "mso-background":
                  case "mso-highlight":
                    g[i] = "background:" + k;
                    continue;
                  case "mso-default-height":
                    g[i] = "min-height:" + b(k);
                    continue;
                  case "mso-default-width":
                    g[i] = "min-width:" + b(k);
                    continue;
                  case "mso-padding-between-alt":
                    g[i] = "border-collapse:separate;border-spacing:" + b(k);
                    continue;
                  case "text-line-through":
                    "single" != k && "double" != k || (g[i] = "text-decoration:line-through");
                    continue;
                  case "mso-zero-height":
                    "yes" == k && (g[i] = "display:none");
                    continue;
                  case "margin":
                    if (!/[1-9]/.test(k)) continue
                }
                if (/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?:decor|trans)|top-bar|version|vnd|word-break)/.test(j) || /text\-indent|padding|margin/.test(j) && /\-[\d.]+/.test(k)) continue;
                g[i] = j + ":" + l[1]
              }
            }
            return c + (g.length ? ' style="' + g.join(";").replace(/;{2,}/g, ";") + '"': "")
          })
      }
      return function(b) {
        return a(b) ? c(b) : b
      }
    } (); !
      function() {
        function a(a, b, c) {
          return a.push(n),
          b + (c ? 1 : -1)
        }
        function b(a, b) {
          for (var c = 0; c < b; c++) a.push(m)
        }
        function c(g, h, i, j) {
          switch (g.type) {
            case "root":
              for (var k, l = 0; k = g.children[l++];) i && "element" == k.type && !dtd.$inlineWithA[k.tagName] && l > 1 && (a(h, j, !0), b(h, j)),
                c(k, h, i, j);
              break;
            case "text":
              d(g, h);
              break;
            case "element":
              e(g, h, i, j);
              break;
            case "comment":
              f(g, h, i)
          }
          return h
        }
        function d(a, b) {
          "pre" == a.parentNode.tagName ? b.push(a.data) : b.push(l[a.parentNode.tagName] ? utils.html(a.data) : a.data.replace(/[ ]{2}/g, " &nbsp;"))
        }
        function e(d, e, f, g) {
          var h = "";
          if (d.attrs) {
            h = [];
            var i = d.attrs;
            for (var j in i) h.push(j + (void 0 !== i[j] ? '="' + (k[j] ? utils.html(i[j]).replace(/["]/g,
              function(a) {
                return "&quot;"
              }) : utils.unhtml(i[j])) + '"': ""));
            h = h.join(" ")
          }
          if (e.push("<" + d.tagName + (h ? " " + h: "") + (dtd.$empty[d.tagName] ? "/": "") + ">"), f && !dtd.$inlineWithA[d.tagName] && "pre" != d.tagName && d.children && d.children.length && (g = a(e, g, !0), b(e, g)), d.children && d.children.length) for (var l, m = 0; l = d.children[m++];) f && "element" == l.type && !dtd.$inlineWithA[l.tagName] && m > 1 && (a(e, g), b(e, g)),
            c(l, e, f, g);
          dtd.$empty[d.tagName] || (f && !dtd.$inlineWithA[d.tagName] && "pre" != d.tagName && d.children && d.children.length && (g = a(e, g), b(e, g)), e.push("</" + d.tagName + ">"))
        }
        function f(a, b) {
          b.push("<!--" + a.data + "-->")
        }
        function g(a, b) {
          var c;
          if ("element" == a.type && a.getAttr("id") == b) return a;
          if (a.children && a.children.length) for (var d, e = 0; d = a.children[e++];) if (c = g(d, b)) return c
        }
        function h(a, b, c) {
          if ("element" == a.type && a.tagName == b && c.push(a), a.children && a.children.length) for (var d, e = 0; d = a.children[e++];) h(d, b, c)
        }
        function i(a, b) {
          if (a.children && a.children.length) for (var c, d = 0; c = a.children[d];) i(c, b),
          c.parentNode && (c.children && c.children.length && b(c), c.parentNode && d++);
          else b(a)
        }
        var j = UE.uNode = function(a) {
            this.type = a.type,
              this.data = a.data,
              this.tagName = a.tagName,
              this.parentNode = a.parentNode,
              this.attrs = a.attrs || {},
              this.children = a.children
          },
          k = {
            href: 1,
            src: 1,
            _src: 1,
            _href: 1,
            cdata_data: 1
          },
          l = {
            style: 1,
            script: 1
          },
          m = "    ",
          n = "\n";
        j.createElement = function(a) {
          return /[<>]/.test(a) ? UE.htmlparser(a).children[0] : new j({
            type: "element",
            children: [],
            tagName: a
          })
        },
          j.createText = function(a, b) {
            return new UE.uNode({
              type: "text",
              data: b ? a: utils.unhtml(a || "")
            })
          },
          j.prototype = {
            toHtml: function(a) {
              var b = [];
              return c(this, b, a, 0),
                b.join("")
            },
            innerHTML: function(a) {
              if ("element" != this.type || dtd.$empty[this.tagName]) return this;
              if (utils.isString(a)) {
                if (this.children) for (var b, c = 0; b = this.children[c++];) b.parentNode = null;
                this.children = [];
                for (var b, d = UE.htmlparser(a), c = 0; b = d.children[c++];) this.children.push(b),
                  b.parentNode = this;
                return this
              }
              var d = new UE.uNode({
                type: "root",
                children: this.children
              });
              return d.toHtml()
            },
            innerText: function(a, b) {
              if ("element" != this.type || dtd.$empty[this.tagName]) return this;
              if (a) {
                if (this.children) for (var c, d = 0; c = this.children[d++];) c.parentNode = null;
                return this.children = [],
                  this.appendChild(j.createText(a, b)),
                  this
              }
              return this.toHtml().replace(/<[^>]+>/g, "")
            },
            getData: function() {
              return "element" == this.type ? "": this.data
            },
            firstChild: function() {
              return this.children ? this.children[0] : null
            },
            lastChild: function() {
              return this.children ? this.children[this.children.length - 1] : null
            },
            previousSibling: function() {
              for (var a, b = this.parentNode,
                     c = 0; a = b.children[c]; c++) if (a === this) return 0 == c ? null: b.children[c - 1]
            },
            nextSibling: function() {
              for (var a, b = this.parentNode,
                     c = 0; a = b.children[c++];) if (a === this) return b.children[c]
            },
            replaceChild: function(a, b) {
              if (this.children) {
                a.parentNode && a.parentNode.removeChild(a);
                for (var c, d = 0; c = this.children[d]; d++) if (c === b) return this.children.splice(d, 1, a),
                  b.parentNode = null,
                  a.parentNode = this,
                  a
              }
            },
            appendChild: function(a) {
              if ("root" == this.type || "element" == this.type && !dtd.$empty[this.tagName]) {
                this.children || (this.children = []),
                a.parentNode && a.parentNode.removeChild(a);
                for (var b, c = 0; b = this.children[c]; c++) if (b === a) {
                  this.children.splice(c, 1);
                  break
                }
                return this.children.push(a),
                  a.parentNode = this,
                  a
              }
            },
            insertBefore: function(a, b) {
              if (this.children) {
                a.parentNode && a.parentNode.removeChild(a);
                for (var c, d = 0; c = this.children[d]; d++) if (c === b) return this.children.splice(d, 0, a),
                  a.parentNode = this,
                  a
              }
            },
            insertAfter: function(a, b) {
              if (this.children) {
                a.parentNode && a.parentNode.removeChild(a);
                for (var c, d = 0; c = this.children[d]; d++) if (c === b) return this.children.splice(d + 1, 0, a),
                  a.parentNode = this,
                  a
              }
            },
            removeChild: function(a, b) {
              if (this.children) for (var c, d = 0; c = this.children[d]; d++) if (c === a) {
                if (this.children.splice(d, 1), c.parentNode = null, b && c.children && c.children.length) for (var e, f = 0; e = c.children[f]; f++) this.children.splice(d + f, 0, e),
                  e.parentNode = this;
                return c
              }
            },
            getAttr: function(a) {
              return this.attrs && this.attrs[a.toLowerCase()]
            },
            setAttr: function(a, b) {
              if (!a) return void delete this.attrs;
              if (this.attrs || (this.attrs = {}), utils.isObject(a)) for (var c in a) a[c] ? this.attrs[c.toLowerCase()] = a[c] : delete this.attrs[c];
              else b ? this.attrs[a.toLowerCase()] = b: delete this.attrs[a]
            },
            getIndex: function() {
              for (var a, b = this.parentNode,
                     c = 0; a = b.children[c]; c++) if (a === this) return c;
              return - 1
            },
            getNodeById: function(a) {
              var b;
              if (this.children && this.children.length) for (var c, d = 0; c = this.children[d++];) if (b = g(c, a)) return b
            },
            getNodesByTagName: function(a) {
              a = utils.trim(a).replace(/[ ]{2,}/g, " ").split(" ");
              var b = [],
                c = this;
              return utils.each(a,
                function(a) {
                  if (c.children && c.children.length) for (var d, e = 0; d = c.children[e++];) h(d, a, b)
                }),
                b
            },
            getStyle: function(a) {
              var b = this.getAttr("style");
              if (!b) return "";
              var c = new RegExp("(^|;)\\s*" + a + ":([^;]+)", "i"),
                d = b.match(c);
              return d && d[0] ? d[2] : ""
            },
            setStyle: function(a, b) {
              function c(a, b) {
                var c = new RegExp("(^|;)\\s*" + a + ":([^;]+;?)", "gi");
                d = d.replace(c, "$1"),
                b && (d = a + ":" + utils.unhtml(b) + ";" + d)
              }
              var d = this.getAttr("style");
              if (d || (d = ""), utils.isObject(a)) for (var e in a) c(e, a[e]);
              else c(a, b);
              this.setAttr("style", utils.trim(d))
            },
            traversal: function(a) {
              return this.children && this.children.length && i(this, a),
                this
            }
          }
      } ();
    var htmlparser = UE.htmlparser = function(a, b) {
        function c(a, b) {
          if (m[a.tagName]) {
            var c = k.createElement(m[a.tagName]);
            a.appendChild(c),
              c.appendChild(k.createText(b)),
              a = c
          } else a.appendChild(k.createText(b))
        }
        function d(a, b, c) {
          var e;
          if (e = l[b]) {
            for (var f, h = a;
                 "root" != h.type;) {
              if (utils.isArray(e) ? utils.indexOf(e, h.tagName) != -1 : e == h.tagName) {
                a = h,
                  f = !0;
                break
              }
              h = h.parentNode
            }
            f || (a = d(a, utils.isArray(e) ? e[0] : e))
          }
          var i = new k({
            parentNode: a,
            type: "element",
            tagName: b.toLowerCase(),
            children: dtd.$empty[b] ? null: []
          });
          if (c) {
            for (var m, n = {}; m = g.exec(c);) n[m[1].toLowerCase()] = j[m[1].toLowerCase()] ? m[2] || m[3] || m[4] : utils.unhtml(m[2] || m[3] || m[4]);
            i.attrs = n
          }
          return a.children.push(i),
            dtd.$empty[b] ? a: i
        }
        function e(a, b) {
          a.children.push(new k({
            type: "comment",
            data: b,
            parentNode: a
          }))
        }
        var f = /<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)-->)|(?:([^\s\/<>]+)\s*((?:(?:"[^"]*")|(?:'[^']*')|[^"'<>])*)\/?>))/g,
          g = /([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,
          h = {
            b: 1,
            code: 1,
            i: 1,
            u: 1,
            strike: 1,
            s: 1,
            tt: 1,
            strong: 1,
            q: 1,
            samp: 1,
            em: 1,
            span: 1,
            sub: 1,
            img: 1,
            sup: 1,
            font: 1,
            big: 1,
            small: 1,
            iframe: 1,
            a: 1,
            br: 1,
            pre: 1
          };
        a = a.replace(new RegExp(domUtils.fillChar, "g"), ""),
        b || (a = a.replace(new RegExp("[\\r\\t\\n" + (b ? "": " ") + "]*</?(\\w+)\\s*(?:[^>]*)>[\\r\\t\\n" + (b ? "": " ") + "]*", "g"),
          function(a, c) {
            return c && h[c.toLowerCase()] ? a.replace(/(^[\n\r]+)|([\n\r]+$)/g, "") : a.replace(new RegExp("^[\\r\\n" + (b ? "": " ") + "]+"), "").replace(new RegExp("[\\r\\n" + (b ? "": " ") + "]+$"), "")
          }));
        for (var i, j = {
            href: 1,
            src: 1
          },
               k = UE.uNode, l = {
            td: "tr",
            tr: ["tbody", "thead", "tfoot"],
            tbody: "table",
            th: "tr",
            thead: "table",
            tfoot: "table",
            caption: "table",
            li: ["ul", "ol"],
            dt: "dl",
            dd: "dl",
            option: "select"
          },
               m = {
                 ol: "li",
                 ul: "li"
               },
               n = 0, o = 0, p = new k({
            type: "root",
            children: []
          }), q = p; i = f.exec(a);) {
          n = i.index;
          try {
            if (n > o && c(q, a.slice(o, n)), i[3]) dtd.$cdata[q.tagName] ? c(q, i[0]) : q = d(q, i[3].toLowerCase(), i[4]);
            else if (i[1]) {
              if ("root" != q.type) if (dtd.$cdata[q.tagName] && !dtd.$cdata[i[1]]) c(q, i[0]);
              else {
                for (var r = q;
                     "element" == q.type && q.tagName != i[1].toLowerCase();) if (q = q.parentNode, "root" == q.type) throw q = r,
                  "break";
                q = q.parentNode
              }
            } else i[2] && e(q, i[2])
          } catch(s) {}
          o = f.lastIndex
        }
        return o < a.length && c(q, a.slice(o)),
          p
      },
      filterNode = UE.filterNode = function() {
        function a(b, c) {
          switch (b.type) {
            case "text":
              break;
            case "element":
              var d;
              if (d = c[b.tagName]) if ("-" === d) b.parentNode.removeChild(b);
              else if (utils.isFunction(d)) {
                var e = b.parentNode,
                  f = b.getIndex();
                if (d(b), b.parentNode) {
                  if (b.children) for (var g, h = 0; g = b.children[h];) a(g, c),
                  g.parentNode && h++
                } else for (var g, h = f; g = e.children[h];) a(g, c),
                g.parentNode && h++
              } else {
                var i = d.$;
                if (i && b.attrs) {
                  var j, k = {};
                  for (var l in i) {
                    if (j = b.getAttr(l), "style" == l && utils.isArray(i[l])) {
                      var m = [];
                      utils.each(i[l],
                        function(a) {
                          var c; (c = b.getStyle(a)) && m.push(a + ":" + c)
                        }),
                        j = m.join(";")
                    }
                    j && (k[l] = j)
                  }
                  b.attrs = k
                }
                if (b.children) for (var g, h = 0; g = b.children[h];) a(g, c),
                g.parentNode && h++
              } else if (dtd.$cdata[b.tagName]) b.parentNode.removeChild(b);
              else {
                var e = b.parentNode,
                  f = b.getIndex();
                b.parentNode.removeChild(b, !0);
                for (var g, h = f; g = e.children[h];) a(g, c),
                g.parentNode && h++
              }
              break;
            case "comment":
              b.parentNode.removeChild(b)
          }
        }
        return function(b, c) {
          if (utils.isEmptyObject(c)) return b;
          var d; (d = c["-"]) && utils.each(d.split(" "),
            function(a) {
              c[a] = "-"
            });
          for (var e, f = 0; e = b.children[f];) a(e, c),
          e.parentNode && f++;
          return b
        }
      } ();
    UE.plugin = function() {
      var a = {};
      return {
        register: function(b, c, d, e) {
          d && utils.isFunction(d) && (e = d, d = null),
            a[b] = {
              optionName: d || b,
              execFn: c,
              afterDisabled: e
            }
        },
        load: function(b) {
          utils.each(a,
            function(a) {
              var c = a.execFn.call(b);
              b.options[a.optionName] !== !1 ? c && utils.each(c,
                function(a, c) {
                  switch (c.toLowerCase()) {
                    case "shortcutkey":
                      b.addshortcutkey(a);
                      break;
                    case "bindevents":
                      utils.each(a,
                        function(a, c) {
                          b.addListener(c, a)
                        });
                      break;
                    case "bindmultievents":
                      utils.each(utils.isArray(a) ? a: [a],
                        function(a) {
                          var c = utils.trim(a.type).split(/\s+/);
                          utils.each(c,
                            function(c) {
                              b.addListener(c, a.handler)
                            })
                        });
                      break;
                    case "commands":
                      utils.each(a,
                        function(a, c) {
                          b.commands[c] = a
                        });
                      break;
                    case "outputrule":
                      b.addOutputRule(a);
                      break;
                    case "inputrule":
                      b.addInputRule(a);
                      break;
                    case "defaultoptions":
                      b.setOpt(a)
                  }
                }):
                a.afterDisabled && a.afterDisabled.call(b)
            }),
            utils.each(UE.plugins,
              function(a) {
                a.call(b)
              })
        },
        run: function(b, c) {
          var d = a[b];
          d && d.exeFn.call(c)
        }
      }
    } ();
    var keymap = UE.keymap = {
        Backspace: 8,
        Tab: 9,
        Enter: 13,
        Shift: 16,
        Control: 17,
        Alt: 18,
        CapsLock: 20,
        Esc: 27,
        Spacebar: 32,
        PageUp: 33,
        PageDown: 34,
        End: 35,
        Home: 36,
        Left: 37,
        Up: 38,
        Right: 39,
        Down: 40,
        Insert: 45,
        Del: 46,
        NumLock: 144,
        Cmd: 91,
        "=": 187,
        "-": 189,
        b: 66,
        i: 73,
        z: 90,
        y: 89,
        v: 86,
        x: 88,
        s: 83,
        n: 78
      },
      LocalStorage = UE.LocalStorage = function() {
        function a() {
          var a = document.createElement("div");
          return a.style.display = "none",
            a.addBehavior ? (a.addBehavior("#default#userdata"), {
              getItem: function(b) {
                var d = null;
                try {
                  document.body.appendChild(a),
                    a.load(c),
                    d = a.getAttribute(b),
                    document.body.removeChild(a)
                } catch(e) {}
                return d
              },
              setItem: function(b, d) {
                document.body.appendChild(a),
                  a.setAttribute(b, d),
                  a.save(c),
                  document.body.removeChild(a)
              },
              removeItem: function(b) {
                document.body.appendChild(a),
                  a.removeAttribute(b),
                  a.save(c),
                  document.body.removeChild(a)
              }
            }) : null
        }
        var b = window.localStorage || a() || null,
          c = "localStorage";
        return {
          saveLocalData: function(a, c) {
            return ! (!b || !c) && (b.setItem(a, c), !0)
          },
          getLocalData: function(a) {
            return b ? b.getItem(a) : null
          },
          removeItem: function(a) {
            b && b.removeItem(a)
          }
        }
      } (); !
      function() {
        var a = "ueditor_preference";
        UE.Editor.prototype.setPreferences = function(b, c) {
          var d = {};
          utils.isString(b) ? d[b] = c: d = b;
          var e = LocalStorage.getLocalData(a);
          e && (e = utils.str2json(e)) ? utils.extend(e, d) : e = d,
          e && LocalStorage.saveLocalData(a, utils.json2str(e))
        },
          UE.Editor.prototype.getPreferences = function(b) {
            var c = LocalStorage.getLocalData(a);
            return c && (c = utils.str2json(c)) ? b ? c[b] : c: null
          },
          UE.Editor.prototype.removePreferences = function(b) {
            var c = LocalStorage.getLocalData(a);
            c && (c = utils.str2json(c)) && (c[b] = void 0, delete c[b]),
            c && LocalStorage.saveLocalData(a, utils.json2str(c))
          }
      } (),
      UE.plugins.defaultfilter = function() {
        var a = this;
        a.setOpt({
          allowDivTransToP: !0,
          disabledTableInTable: !0
        }),
          a.addInputRule(function(b) {
            function c(a) {
              for (; a && "element" == a.type;) {
                if ("td" == a.tagName) return ! 0;
                a = a.parentNode
              }
              return ! 1
            }
            var d, e = this.options.allowDivTransToP;
            b.traversal(function(b) {
              if ("element" == b.type) {
                if (!dtd.$cdata[b.tagName] && a.options.autoClearEmptyNode && dtd.$inline[b.tagName] && !dtd.$empty[b.tagName] && (!b.attrs || utils.isEmptyObject(b.attrs))) return void(b.firstChild() ? "span" != b.tagName || b.attrs && !utils.isEmptyObject(b.attrs) || b.parentNode.removeChild(b, !0) : b.parentNode.removeChild(b));
                switch (b.tagName) {
                  case "style":
                  case "script":
                    b.setAttr({
                      cdata_tag:
                      b.tagName,
                      cdata_data: b.innerHTML() || "",
                      _ue_custom_node_: "true"
                    }),
                      b.tagName = "div",
                      b.innerHTML("");
                    break;
                  case "a":
                    (d = b.getAttr("href")) && b.setAttr("_href", d);
                    break;
                  case "img":
                    if ((d = b.getAttr("src")) && /^data:/.test(d)) {
                      b.parentNode.removeChild(b);
                      break
                    }
                    b.setAttr("_src", b.getAttr("src"));
                    break;
                  case "span":
                    browser.webkit && (d = b.getStyle("white-space")) && /nowrap|normal/.test(d) && (b.setStyle("white-space", ""), a.options.autoClearEmptyNode && utils.isEmptyObject(b.attrs) && b.parentNode.removeChild(b, !0)),
                      d = b.getAttr("id"),
                    d && /^_baidu_bookmark_/i.test(d) && b.parentNode.removeChild(b);
                    break;
                  case "p":
                    (d = b.getAttr("align")) && (b.setAttr("align"), b.setStyle("text-align", d)),
                      utils.each(b.children,
                        function(a) {
                          if ("element" == a.type && "p" == a.tagName) {
                            var c = a.nextSibling();
                            b.parentNode.insertAfter(a, b);
                            for (var d = a; c;) {
                              var e = c.nextSibling();
                              b.parentNode.insertAfter(c, d),
                                d = c,
                                c = e
                            }
                            return ! 1
                          }
                        }),
                    b.firstChild() || b.innerHTML(browser.ie ? "&nbsp;": "<br/>");
                    break;
                  case "div":
                    if (b.getAttr("cdata_tag")) break;
                    if (d = b.getAttr("class"), d && /^line number\d+/.test(d)) break;
                    if (!e) break;
                    for (var f, g = UE.uNode.createElement("p"); f = b.firstChild();)"text" != f.type && UE.dom.dtd.$block[f.tagName] ? g.firstChild() ? (b.parentNode.insertBefore(g, b), g = UE.uNode.createElement("p")) : b.parentNode.insertBefore(f, b) : g.appendChild(f);
                    g.firstChild() && b.parentNode.insertBefore(g, b),
                      b.parentNode.removeChild(b);
                    break;
                  case "dl":
                    b.tagName = "ul";
                    break;
                  case "dt":
                  case "dd":
                    b.tagName = "li";
                    break;
                  case "li":
                    var h = b.getAttr("class");
                    h && /list\-/.test(h) || b.setAttr();
                    var i = b.getNodesByTagName("ol ul");
                    UE.utils.each(i,
                      function(a) {
                        b.parentNode.insertAfter(a, b)
                      });
                    break;
                  case "td":
                  case "th":
                  case "caption":
                    b.children && b.children.length || b.appendChild(browser.ie11below ? UE.uNode.createText(" ") : UE.uNode.createElement("br"));
                    break;
                  case "table":
                    a.options.disabledTableInTable && c(b) && (b.parentNode.insertBefore(UE.uNode.createText(b.innerText()), b), b.parentNode.removeChild(b))
                }
              }
            })
          }),
          a.addOutputRule(function(b) {
            var c;
            b.traversal(function(b) {
              if ("element" == b.type) {
                if (a.options.autoClearEmptyNode && dtd.$inline[b.tagName] && !dtd.$empty[b.tagName] && (!b.attrs || utils.isEmptyObject(b.attrs))) return void(b.firstChild() ? "span" != b.tagName || b.attrs && !utils.isEmptyObject(b.attrs) || b.parentNode.removeChild(b, !0) : b.parentNode.removeChild(b));
                switch (b.tagName) {
                  case "div":
                    (c = b.getAttr("cdata_tag")) && (b.tagName = c, b.appendChild(UE.uNode.createText(b.getAttr("cdata_data"))), b.setAttr({
                      cdata_tag: "",
                      cdata_data: "",
                      _ue_custom_node_: ""
                    }));
                    break;
                  case "a":
                    (c = b.getAttr("_href")) && b.setAttr({
                      href: utils.html(c),
                      _href: ""
                    });
                    break;
                  case "span":
                    c = b.getAttr("id"),
                    c && /^_baidu_bookmark_/i.test(c) && b.parentNode.removeChild(b);
                    break;
                  case "img":
                    (c = b.getAttr("_src")) && b.setAttr({
                      src: b.getAttr("_src"),
                      _src: ""
                    })
                }
              }
            })
          })
      },
      UE.commands.inserthtml = {
        execCommand: function(a, b, c) {
          var d, e, f = this;
          if (b && f.fireEvent("beforeinserthtml", b) !== !0) {
            if (d = f.selection.getRange(), e = d.document.createElement("div"), e.style.display = "inline", !c) {
              var g = UE.htmlparser(b);
              f.options.filterRules && UE.filterNode(g, f.options.filterRules),
                f.filterInputRule(g),
                b = g.toHtml()
            }
            if (e.innerHTML = utils.trim(b), !d.collapsed) {
              var h = d.startContainer;
              if (domUtils.isFillChar(h) && d.setStartBefore(h), h = d.endContainer, domUtils.isFillChar(h) && d.setEndAfter(h), d.txtToElmBoundary(), d.endContainer && 1 == d.endContainer.nodeType && (h = d.endContainer.childNodes[d.endOffset], h && domUtils.isBr(h) && d.setEndAfter(h)), 0 == d.startOffset && (h = d.startContainer, domUtils.isBoundaryNode(h, "firstChild") && (h = d.endContainer, d.endOffset == (3 == h.nodeType ? h.nodeValue.length: h.childNodes.length) && domUtils.isBoundaryNode(h, "lastChild") && (f.body.innerHTML = "<p>" + (browser.ie ? "": "<br/>") + "</p>", d.setStart(f.body.firstChild, 0).collapse(!0)))), !d.collapsed && d.deleteContents(), 1 == d.startContainer.nodeType) {
                var i, j = d.startContainer.childNodes[d.startOffset];
                if (j && domUtils.isBlockElm(j) && (i = j.previousSibling) && domUtils.isBlockElm(i)) {
                  for (d.setEnd(i, i.childNodes.length).collapse(); j.firstChild;) i.appendChild(j.firstChild);
                  domUtils.remove(j)
                }
              }
            }
            var j, k, i, l, m, n = 0;
            d.inFillChar() && (j = d.startContainer, domUtils.isFillChar(j) ? (d.setStartBefore(j).collapse(!0), domUtils.remove(j)) : domUtils.isFillChar(j, !0) && (j.nodeValue = j.nodeValue.replace(fillCharReg, ""), d.startOffset--, d.collapsed && d.collapse(!0)));
            var o = domUtils.findParentByTagName(d.startContainer, "li", !0);
            if (o) {
              for (var p, q; j = e.firstChild;) {
                for (; j && (3 == j.nodeType || !domUtils.isBlockElm(j) || "HR" == j.tagName);) p = j.nextSibling,
                  d.insertNode(j).collapse(),
                  q = j,
                  j = p;
                if (j) if (/^(ol|ul)$/i.test(j.tagName)) {
                  for (; j.firstChild;) q = j.firstChild,
                    domUtils.insertAfter(o, j.firstChild),
                    o = o.nextSibling;
                  domUtils.remove(j)
                } else {
                  var r;
                  p = j.nextSibling,
                    r = f.document.createElement("li"),
                    domUtils.insertAfter(o, r),
                    r.appendChild(j),
                    q = j,
                    j = p,
                    o = r
                }
              }
              o = domUtils.findParentByTagName(d.startContainer, "li", !0),
              domUtils.isEmptyBlock(o) && domUtils.remove(o),
              q && d.setStartAfter(q).collapse(!0).select(!0)
            } else {
              for (; j = e.firstChild;) {
                if (n) {
                  for (var s = f.document.createElement("p"); j && (3 == j.nodeType || !dtd.$block[j.tagName]);) m = j.nextSibling,
                    s.appendChild(j),
                    j = m;
                  s.firstChild && (j = s)
                }
                if (d.insertNode(j), m = j.nextSibling, !n && j.nodeType == domUtils.NODE_ELEMENT && domUtils.isBlockElm(j) && (k = domUtils.findParent(j,
                  function(a) {
                    return domUtils.isBlockElm(a)
                  }), k && "body" != k.tagName.toLowerCase() && (!dtd[k.tagName][j.nodeName] || j.parentNode !== k))) {
                  if (dtd[k.tagName][j.nodeName]) for (l = j.parentNode; l !== k;) i = l,
                    l = l.parentNode;
                  else i = k;
                  domUtils.breakParent(j, i || l);
                  var i = j.previousSibling;
                  domUtils.trimWhiteTextNode(i),
                  i.childNodes.length || domUtils.remove(i),
                  !browser.ie && (p = j.nextSibling) && domUtils.isBlockElm(p) && p.lastChild && !domUtils.isBr(p.lastChild) && p.appendChild(f.document.createElement("br")),
                    n = 1
                }
                var p = j.nextSibling;
                if (!e.firstChild && p && domUtils.isBlockElm(p)) {
                  d.setStart(p, 0).collapse(!0);
                  break
                }
                d.setEndAfter(j).collapse()
              }
              if (j = d.startContainer, m && domUtils.isBr(m) && domUtils.remove(m), domUtils.isBlockElm(j) && domUtils.isEmptyNode(j)) if (m = j.nextSibling) domUtils.remove(j),
              1 == m.nodeType && dtd.$block[m.tagName] && d.setStart(m, 0).collapse(!0).shrinkBoundary();
              else try {
                  j.innerHTML = browser.ie ? domUtils.fillChar: "<br/>"
                } catch(t) {
                  d.setStartBefore(j),
                    domUtils.remove(j)
                }
              try {
                d.select(!0)
              } catch(t) {}
            }
            setTimeout(function() {
                d = f.selection.getRange(),
                  d.scrollToView(f.autoHeightEnabled, f.autoHeightEnabled ? domUtils.getXY(f.iframe).y: 0),
                  f.fireEvent("afterinserthtml", b)
              },
              200)
          }
        }
      },
      UE.plugins.autotypeset = function() {
        function a(a, b) {
          return a && 3 != a.nodeType ? domUtils.isBr(a) ? 1 : a && a.parentNode && l[a.tagName.toLowerCase()] ? g && g.contains(a) || a.getAttribute("pagebreak") ? 0 : b ? !domUtils.isEmptyBlock(a) : domUtils.isEmptyBlock(a, new RegExp("[\\s" + domUtils.fillChar + "]", "g")) : void 0 : 0
        }
        function b(a) {
          a.style.cssText || (domUtils.removeAttributes(a, ["style"]), "span" == a.tagName.toLowerCase() && domUtils.hasNoAttributes(a) && domUtils.remove(a, !0))
        }
        function c(c, f) {
          var h, l = this;
          if (f) {
            if (!i.pasteFilter) return;
            h = l.document.createElement("div"),
              h.innerHTML = f.html
          } else h = l.document.body;
          for (var m, n = domUtils.getElementsByTagName(h, "*"), o = 0; m = n[o++];) if (l.fireEvent("excludeNodeinautotype", m) !== !0) {
            if (i.clearFontSize && m.style.fontSize && (domUtils.removeStyle(m, "font-size"), b(m)), i.clearFontFamily && m.style.fontFamily && (domUtils.removeStyle(m, "font-family"), b(m)), a(m)) {
              if (i.mergeEmptyline) for (var p, q = m.nextSibling,
                                           r = domUtils.isBr(m); a(q) && (p = q, q = p.nextSibling, !r || q && (!q || domUtils.isBr(q)));) domUtils.remove(p);
              if (i.removeEmptyline && domUtils.inDoc(m, h) && !k[m.parentNode.tagName.toLowerCase()]) {
                if (domUtils.isBr(m) && (q = m.nextSibling, q && !domUtils.isBr(q))) continue;
                domUtils.remove(m);
                continue
              }
            }
            if (a(m, !0) && "SPAN" != m.tagName && (i.indent && (m.style.textIndent = i.indentValue), i.textAlign && (m.style.textAlign = i.textAlign)), i.removeClass && m.className && !j[m.className.toLowerCase()]) {
              if (g && g.contains(m)) continue;
              domUtils.removeAttributes(m, ["class"])
            }
            if (i.imageBlockLine && "img" == m.tagName.toLowerCase() && !m.getAttribute("emotion")) if (f) {
              var s = m;
              switch (i.imageBlockLine) {
                case "left":
                case "right":
                case "none":
                  for (var p, t, q, u = s.parentNode; dtd.$inline[u.tagName] || "A" == u.tagName;) u = u.parentNode;
                  if (p = u, "P" == p.tagName && "center" == domUtils.getStyle(p, "text-align") && !domUtils.isBody(p) && 1 == domUtils.getChildCount(p,
                    function(a) {
                      return ! domUtils.isBr(a) && !domUtils.isWhitespace(a)
                    })) if (t = p.previousSibling, q = p.nextSibling, t && q && 1 == t.nodeType && 1 == q.nodeType && t.tagName == q.tagName && domUtils.isBlockElm(t)) {
                    for (t.appendChild(p.firstChild); q.firstChild;) t.appendChild(q.firstChild);
                    domUtils.remove(p),
                      domUtils.remove(q)
                  } else domUtils.setStyle(p, "text-align", "");
                  domUtils.setStyle(s, "float", i.imageBlockLine);
                  break;
                case "center":
                  if ("center" != l.queryCommandValue("imagefloat")) {
                    for (u = s.parentNode, domUtils.setStyle(s, "float", "none"), p = s; u && 1 == domUtils.getChildCount(u,
                      function(a) {
                        return ! domUtils.isBr(a) && !domUtils.isWhitespace(a)
                      }) && (dtd.$inline[u.tagName] || "A" == u.tagName);) p = u,
                      u = u.parentNode;
                    var v = l.document.createElement("p");
                    domUtils.setAttributes(v, {
                      style: "text-align:center"
                    }),
                      p.parentNode.insertBefore(v, p),
                      v.appendChild(p),
                      domUtils.setStyle(p, "float", "")
                  }
              }
            } else {
              var w = l.selection.getRange();
              w.selectNode(m).select(),
                l.execCommand("imagefloat", i.imageBlockLine)
            }
            i.removeEmptyNode && i.removeTagNames[m.tagName.toLowerCase()] && domUtils.hasNoAttributes(m) && domUtils.isEmptyBlock(m) && domUtils.remove(m)
          }
          if (i.tobdc) {
            var x = UE.htmlparser(h.innerHTML);
            x.traversal(function(a) {
              "text" == a.type && (a.data = e(a.data))
            }),
              h.innerHTML = x.toHtml()
          }
          if (i.bdc2sb) {
            var x = UE.htmlparser(h.innerHTML);
            x.traversal(function(a) {
              "text" == a.type && (a.data = d(a.data))
            }),
              h.innerHTML = x.toHtml()
          }
          f && (f.html = h.innerHTML)
        }
        function d(a) {
          for (var b = "",
                 c = 0; c < a.length; c++) {
            var d = a.charCodeAt(c);
            b += d >= 65281 && d <= 65373 ? String.fromCharCode(a.charCodeAt(c) - 65248) : 12288 == d ? String.fromCharCode(a.charCodeAt(c) - 12288 + 32) : a.charAt(c)
          }
          return b
        }
        function e(a) {
          a = utils.html(a);
          for (var b = "",
                 c = 0; c < a.length; c++) b += 32 == a.charCodeAt(c) ? String.fromCharCode(12288) : a.charCodeAt(c) < 127 ? String.fromCharCode(a.charCodeAt(c) + 65248) : a.charAt(c);
          return b
        }
        function f() {
          var a = h.getPreferences("autotypeset");
          utils.extend(h.options.autotypeset, a)
        }
        this.setOpt({
          autotypeset: {
            mergeEmptyline: !0,
            removeClass: !0,
            removeEmptyline: !1,
            textAlign: "left",
            imageBlockLine: "center",
            pasteFilter: !1,
            clearFontSize: !1,
            clearFontFamily: !1,
            removeEmptyNode: !1,
            removeTagNames: utils.extend({
                div: 1
              },
              dtd.$removeEmpty),
            indent: !1,
            indentValue: "2em",
            bdc2sb: !1,
            tobdc: !1
          }
        });
        var g, h = this,
          i = h.options.autotypeset,
          j = {
            selectTdClass: 1,
            pagebreak: 1,
            anchorclass: 1
          },
          k = {
            li: 1
          },
          l = {
            div: 1,
            p: 1,
            blockquote: 1,
            center: 1,
            h1: 1,
            h2: 1,
            h3: 1,
            h4: 1,
            h5: 1,
            h6: 1,
            span: 1
          };
        i && (f(), i.pasteFilter && h.addListener("beforepaste", c), h.commands.autotypeset = {
          execCommand: function() {
            h.removeListener("beforepaste", c),
            i.pasteFilter && h.addListener("beforepaste", c),
              c.call(h)
          }
        })
      },
      UE.plugin.register("autosubmit",
        function() {
          return {
            shortcutkey: {
              autosubmit: "ctrl+13"
            },
            commands: {
              autosubmit: {
                execCommand: function() {
                  var a = this,
                    b = domUtils.findParentByTagName(a.iframe, "form", !1);
                  if (b) {
                    if (a.fireEvent("beforesubmit") === !1) return;
                    a.sync(),
                      b.submit()
                  }
                }
              }
            }
          }
        }),
      UE.plugin.register("background",
        function() {
          function a(a) {
            var b = {},
              c = a.split(";");
            return utils.each(c,
              function(a) {
                var c = a.indexOf(":"),
                  d = utils.trim(a.substr(0, c)).toLowerCase();
                d && (b[d] = utils.trim(a.substr(c + 1) || ""))
              }),
              b
          }
          function b(a) {
            if (a) {
              var b = [];
              for (var c in a) a.hasOwnProperty(c) && b.push(c + ":" + a[c] + "; ");
              utils.cssRule(e, b.length ? "body{" + b.join("") + "}": "", d.document)
            } else utils.cssRule(e, "", d.document)
          }
          var c, d = this,
            e = "editor_background",
            f = new RegExp("body[\\s]*\\{(.+)\\}", "i"),
            g = d.hasContents;
          return d.hasContents = function() {
            return !! d.queryCommandValue("background") || g.apply(d, arguments)
          },
            {
              bindEvents: {
                getAllHtml: function(a, b) {
                  var c = this.body,
                    e = domUtils.getComputedStyle(c, "background-image"),
                    f = "";
                  f = e.indexOf(d.options.imagePath) > 0 ? e.substring(e.indexOf(d.options.imagePath), e.length - 1).replace(/"|\(|\)/gi, "") : "none" != e ? e.replace(/url\("?|"?\)/gi, "") : "";
                  var g = '<style type="text/css">body{',
                    h = {
                      "background-color": domUtils.getComputedStyle(c, "background-color") || "#ffffff",
                      "background-image": f ? "url(" + f + ")": "",
                      "background-repeat": domUtils.getComputedStyle(c, "background-repeat") || "",
                      "background-position": browser.ie ? domUtils.getComputedStyle(c, "background-position-x") + " " + domUtils.getComputedStyle(c, "background-position-y") : domUtils.getComputedStyle(c, "background-position"),
                      height: domUtils.getComputedStyle(c, "height")
                    };
                  for (var i in h) h.hasOwnProperty(i) && (g += i + ":" + h[i] + "; ");
                  g += "}</style> ",
                    b.push(g)
                },
                aftersetcontent: function() {
                  0 == c && b()
                }
              },
              inputRule: function(d) {
                c = !1,
                  utils.each(d.getNodesByTagName("p"),
                    function(d) {
                      var e = d.getAttr("data-background");
                      e && (c = !0, b(a(e)), d.parentNode.removeChild(d))
                    })
              },
              outputRule: function(a) {
                var b = this,
                  c = (utils.cssRule(e, b.document) || "").replace(/[\n\r]+/g, "").match(f);
                c && a.appendChild(UE.uNode.createElement('<p style="display:none;" data-background="' + utils.trim(c[1].replace(/"/g, "").replace(/[\s]+/g, " ")) + '"><br/></p>'))
              },
              commands: {
                background: {
                  execCommand: function(a, c) {
                    b(c)
                  },
                  queryCommandValue: function() {
                    var b = this,
                      c = (utils.cssRule(e, b.document) || "").replace(/[\n\r]+/g, "").match(f);
                    return c ? a(c[1]) : null
                  },
                  notNeedUndo: !0
                }
              }
            }
        }),
      UE.commands.imagefloat = {
        execCommand: function(a, b) {
          var c = this,
            d = c.selection.getRange();
          if (!d.collapsed) {
            var e = d.getClosedNode();
            if (e && "IMG" == e.tagName) switch (b) {
              case "left":
              case "right":
              case "none":
                for (var f, g, h, i = e.parentNode; dtd.$inline[i.tagName] || "A" == i.tagName;) i = i.parentNode;
                if (f = i, "P" == f.tagName && "center" == domUtils.getStyle(f, "text-align")) {
                  if (!domUtils.isBody(f) && 1 == domUtils.getChildCount(f,
                    function(a) {
                      return ! domUtils.isBr(a) && !domUtils.isWhitespace(a)
                    })) if (g = f.previousSibling, h = f.nextSibling, g && h && 1 == g.nodeType && 1 == h.nodeType && g.tagName == h.tagName && domUtils.isBlockElm(g)) {
                    for (g.appendChild(f.firstChild); h.firstChild;) g.appendChild(h.firstChild);
                    domUtils.remove(f),
                      domUtils.remove(h)
                  } else domUtils.setStyle(f, "text-align", "");
                  d.selectNode(e).select()
                }
                domUtils.setStyle(e, "float", "none" == b ? "": b),
                "none" == b && domUtils.removeAttributes(e, "align");
                break;
              case "center":
                if ("center" != c.queryCommandValue("imagefloat")) {
                  for (i = e.parentNode, domUtils.setStyle(e, "float", ""), domUtils.removeAttributes(e, "align"), f = e; i && 1 == domUtils.getChildCount(i,
                    function(a) {
                      return ! domUtils.isBr(a) && !domUtils.isWhitespace(a)
                    }) && (dtd.$inline[i.tagName] || "A" == i.tagName);) f = i,
                    i = i.parentNode;
                  d.setStartBefore(f).setCursor(!1),
                    i = c.document.createElement("div"),
                    i.appendChild(f),
                    domUtils.setStyle(f, "float", ""),
                    c.execCommand("insertHtml", '<p id="_img_parent_tmp" style="text-align:center">' + i.innerHTML + "</p>"),
                    f = c.document.getElementById("_img_parent_tmp"),
                    f.removeAttribute("id"),
                    f = f.firstChild,
                    d.selectNode(f).select(),
                    h = f.parentNode.nextSibling,
                  h && domUtils.isEmptyNode(h) && domUtils.remove(h)
                }
            }
          }
        },
        queryCommandValue: function() {
          var a, b, c = this.selection.getRange();
          return c.collapsed ? "none": (a = c.getClosedNode(), a && 1 == a.nodeType && "IMG" == a.tagName ? (b = domUtils.getComputedStyle(a, "float") || a.getAttribute("align"), "none" == b && (b = "center" == domUtils.getComputedStyle(a.parentNode, "text-align") ? "center": b), {
            left: 1,
            right: 1,
            center: 1
          } [b] ? b: "none") : "none")
        },
        queryCommandState: function() {
          var a, b = this.selection.getRange();
          return b.collapsed ? -1 : (a = b.getClosedNode(), a && 1 == a.nodeType && "IMG" == a.tagName ? 0 : -1)
        }
      },
      UE.commands.insertimage = {
        execCommand: function(a, b) {
          function c(a) {
            utils.each("width,height,border,hspace,vspace".split(","),
              function(b) {
                a[b] && (a[b] = parseInt(a[b], 10) || 0)
              }),
              utils.each("src,_src".split(","),
                function(b) {
                  a[b] && (a[b] = utils.unhtmlForUrl(a[b]))
                }),
              utils.each("title,alt".split(","),
                function(b) {
                  a[b] && (a[b] = utils.unhtml(a[b]))
                })
          }
          if (b = utils.isArray(b) ? b: [b], b.length) {
            var d = this,
              e = d.selection.getRange(),
              f = e.getClosedNode();
            if (d.fireEvent("beforeinsertimage", b) !== !0) {
              if (!f || !/img/i.test(f.tagName) || "edui-faked-video" == f.className && f.className.indexOf("edui-upload-video") == -1 || f.getAttribute("word_img")) {
                var g, h = [],
                  i = "";
                if (g = b[0], 1 == b.length) c(g),
                  i = '<img src="' + g.src + '" ' + (g._src ? ' _src="' + g._src + '" ': "") + (g.width ? 'width="' + g.width + '" ': "") + (g.height ? ' height="' + g.height + '" ': "") + ("left" == g.floatStyle || "right" == g.floatStyle ? ' style="float:' + g.floatStyle + ';"': "") + (g.title && "" != g.title ? ' title="' + g.title + '"': "") + (g.border && "0" != g.border ? ' border="' + g.border + '"': "") + (g.alt && "" != g.alt ? ' alt="' + g.alt + '"': "") + (g.hspace && "0" != g.hspace ? ' hspace = "' + g.hspace + '"': "") + (g.vspace && "0" != g.vspace ? ' vspace = "' + g.vspace + '"': "") + "/>",
                "center" == g.floatStyle && (i = '<p style="text-align: center">' + i + "</p>"),
                  h.push(i);
                else for (var j = 0; g = b[j++];) c(g),
                  i = "<p " + ("center" == g.floatStyle ? 'style="text-align: center" ': "") + '><img src="' + g.src + '" ' + (g.width ? 'width="' + g.width + '" ': "") + (g._src ? ' _src="' + g._src + '" ': "") + (g.height ? ' height="' + g.height + '" ': "") + ' style="' + (g.floatStyle && "center" != g.floatStyle ? "float:" + g.floatStyle + ";": "") + (g.border || "") + '" ' + (g.title ? ' title="' + g.title + '"': "") + " /></p>",
                  h.push(i);
                d.execCommand("insertHtml", h.join(""))
              } else {
                var k = b.shift(),
                  l = k.floatStyle;
                delete k.floatStyle,
                  domUtils.setAttributes(f, k),
                  d.execCommand("imagefloat", l),
                b.length > 0 && (e.setStartAfter(f).setCursor(!1, !0), d.execCommand("insertimage", b))
              }
              d.fireEvent("afterinsertimage", b)
            }
          }
        }
      },
      UE.plugins.justify = function() {
        var a = domUtils.isBlockElm,
          b = {
            left: 1,
            right: 1,
            center: 1,
            justify: 1
          },
          c = function(b, c) {
            var d = b.createBookmark(),
              e = function(a) {
                return 1 == a.nodeType ? "br" != a.tagName.toLowerCase() && !domUtils.isBookmarkNode(a) : !domUtils.isWhitespace(a)
              };
            b.enlarge(!0);
            for (var f, g = b.createBookmark(), h = domUtils.getNextDomNode(g.start, !1, e), i = b.cloneRange(); h && !(domUtils.getPosition(h, g.end) & domUtils.POSITION_FOLLOWING);) if (3 != h.nodeType && a(h)) h = domUtils.getNextDomNode(h, !0, e);
            else {
              for (i.setStartBefore(h); h && h !== g.end && !a(h);) f = h,
                h = domUtils.getNextDomNode(h, !1, null,
                  function(b) {
                    return ! a(b)
                  });
              i.setEndAfter(f);
              var j = i.getCommonAncestor();
              if (!domUtils.isBody(j) && a(j)) domUtils.setStyles(j, utils.isString(c) ? {
                "text-align": c
              }: c),
                h = j;
              else {
                var k = b.document.createElement("p");
                domUtils.setStyles(k, utils.isString(c) ? {
                  "text-align": c
                }: c);
                var l = i.extractContents();
                k.appendChild(l),
                  i.insertNode(k),
                  h = k
              }
              h = domUtils.getNextDomNode(h, !1, e)
            }
            return b.moveToBookmark(g).moveToBookmark(d)
          };
        UE.commands.justify = {
          execCommand: function(a, b) {
            var d, e = this.selection.getRange();
            return e.collapsed && (d = this.document.createTextNode("p"), e.insertNode(d)),
              c(e, b),
            d && (e.setStartBefore(d).collapse(!0), domUtils.remove(d)),
              e.select(),
              !0
          },
          queryCommandValue: function() {
            var a = this.selection.getStart(),
              c = domUtils.getComputedStyle(a, "text-align");
            return b[c] ? c: "left"
          },
          queryCommandState: function() {
            var a = this.selection.getStart(),
              b = a && domUtils.findParentByTagName(a, ["td", "th", "caption"], !0);
            return b ? -1 : 0
          }
        }
      },
      UE.plugins.font = function() {
        function a(a) {
          for (var b; (b = a.parentNode) && "SPAN" == b.tagName && 1 == domUtils.getChildCount(b,
            function(a) {
              return ! domUtils.isBookmarkNode(a) && !domUtils.isBr(a)
            });) b.style.cssText += a.style.cssText,
            domUtils.remove(a, !0),
            a = b
        }
        function b(a, b, c) {
          if (g[b] && (a.adjustmentBoundary(), !a.collapsed && 1 == a.startContainer.nodeType)) {
            var d = a.startContainer.childNodes[a.startOffset];
            if (d && domUtils.isTagNode(d, "span")) {
              var e = a.createBookmark();
              utils.each(domUtils.getElementsByTagName(d, "span"),
                function(a) {
                  a.parentNode && !domUtils.isBookmarkNode(a) && ("backcolor" == b && domUtils.getComputedStyle(a, "background-color").toLowerCase() === c || (domUtils.removeStyle(a, g[b]), 0 == a.style.cssText.replace(/^\s+$/, "").length && domUtils.remove(a, !0)))
                }),
                a.moveToBookmark(e)
            }
          }
        }
        function c(c, d, e) {
          var f, g = c.collapsed,
            h = c.createBookmark();
          if (g) for (f = h.start.parentNode; dtd.$inline[f.tagName];) f = f.parentNode;
          else f = domUtils.getCommonAncestor(h.start, h.end);
          utils.each(domUtils.getElementsByTagName(f, "span"),
            function(b) {
              if (b.parentNode && !domUtils.isBookmarkNode(b)) {
                if (/\s*border\s*:\s*none;?\s*/i.test(b.style.cssText)) return void(/^\s*border\s*:\s*none;?\s*$/.test(b.style.cssText) ? domUtils.remove(b, !0) : domUtils.removeStyle(b, "border"));
                if (/border/i.test(b.style.cssText) && "SPAN" == b.parentNode.tagName && /border/i.test(b.parentNode.style.cssText) && (b.style.cssText = b.style.cssText.replace(/border[^:]*:[^;]+;?/gi, "")), "fontborder" != d || "none" != e) for (var c = b.nextSibling; c && 1 == c.nodeType && "SPAN" == c.tagName;) if (domUtils.isBookmarkNode(c) && "fontborder" == d) b.appendChild(c),
                  c = b.nextSibling;
                else {
                  if (c.style.cssText == b.style.cssText && (domUtils.moveChild(c, b), domUtils.remove(c)), b.nextSibling === c) break;
                  c = b.nextSibling
                }
                if (a(b), browser.ie && browser.version > 8) {
                  var f = domUtils.findParent(b,
                    function(a) {
                      return "SPAN" == a.tagName && /background-color/.test(a.style.cssText)
                    });
                  f && !/background-color/.test(b.style.cssText) && (b.style.backgroundColor = f.style.backgroundColor)
                }
              }
            }),
            c.moveToBookmark(h),
            b(c, d, e)
        }
        var d = this,
          e = {
            forecolor: "color",
            backcolor: "background-color",
            fontsize: "font-size",
            fontfamily: "font-family",
            underline: "text-decoration",
            strikethrough: "text-decoration",
            fontborder: "border"
          },
          f = {
            underline: 1,
            strikethrough: 1,
            fontborder: 1
          },
          g = {
            forecolor: "color",
            backcolor: "background-color",
            fontsize: "font-size",
            fontfamily: "font-family"
          };
        d.setOpt({
          fontfamily: [{
            name: "songti",
            val: "宋体,SimSun"
          },
            {
              name: "yahei",
              val: "微软雅黑,Microsoft YaHei"
            },
            {
              name: "kaiti",
              val: "楷体,楷体_GB2312, SimKai"
            },
            {
              name: "heiti",
              val: "黑体, SimHei"
            },
            {
              name: "lishu",
              val: "隶书, SimLi"
            },
            {
              name: "andaleMono",
              val: "andale mono"
            },
            {
              name: "arial",
              val: "arial, helvetica,sans-serif"
            },
            {
              name: "arialBlack",
              val: "arial black,avant garde"
            },
            {
              name: "comicSansMs",
              val: "comic sans ms"
            },
            {
              name: "impact",
              val: "impact,chicago"
            },
            {
              name: "timesNewRoman",
              val: "times new roman"
            }],
          fontsize: [10, 11, 12, 14, 16, 18, 20, 24, 36]
        }),
          d.addInputRule(function(a) {
            utils.each(a.getNodesByTagName("u s del font strike"),
              function(a) {
                if ("font" == a.tagName) {
                  var b = [];
                  for (var c in a.attrs) switch (c) {
                    case "size":
                      b.push("font-size:" + ({
                        1 : "10",
                        2 : "12",
                        3 : "16",
                        4 : "18",
                        5 : "24",
                        6 : "32",
                        7 : "48"
                      } [a.attrs[c]] || a.attrs[c]) + "px");
                      break;
                    case "color":
                      b.push("color:" + a.attrs[c]);
                      break;
                    case "face":
                      b.push("font-family:" + a.attrs[c]);
                      break;
                    case "style":
                      b.push(a.attrs[c])
                  }
                  a.attrs = {
                    style: b.join(";")
                  }
                } else {
                  var d = "u" == a.tagName ? "underline": "line-through";
                  a.attrs = {
                    style: (a.getAttr("style") || "") + "text-decoration:" + d + ";"
                  }
                }
                a.tagName = "span"
              })
          });
        for (var h in e) !
          function(a, b) {
            UE.commands[a] = {
              execCommand: function(d, e) {
                e = e || (this.queryCommandState(d) ? "none": "underline" == d ? "underline": "fontborder" == d ? "1px solid #000": "line-through");
                var g, h = this,
                  i = this.selection.getRange();
                if ("default" == e) i.collapsed && (g = h.document.createTextNode("font"), i.insertNode(g).select()),
                  h.execCommand("removeFormat", "span,a", b),
                g && (i.setStartBefore(g).collapse(!0), domUtils.remove(g)),
                  c(i, d, e),
                  i.select();
                else if (i.collapsed) {
                  var j = domUtils.findParentByTagName(i.startContainer, "span", !0);
                  if (g = h.document.createTextNode("font"), !j || j.children.length || j[browser.ie ? "innerText": "textContent"].replace(fillCharReg, "").length) {
                    if (i.insertNode(g), i.selectNode(g).select(), j = i.document.createElement("span"), f[a]) {
                      if (domUtils.findParentByTagName(g, "a", !0)) return i.setStartBefore(g).setCursor(),
                        void domUtils.remove(g);
                      h.execCommand("removeFormat", "span,a", b)
                    }
                    if (j.style.cssText = b + ":" + e, g.parentNode.insertBefore(j, g), !browser.ie || browser.ie && 9 == browser.version) for (var k = j.parentNode; ! domUtils.isBlockElm(k);)"SPAN" == k.tagName && (j.style.cssText = k.style.cssText + ";" + j.style.cssText),
                      k = k.parentNode;
                    opera ? setTimeout(function() {
                      i.setStart(j, 0).collapse(!0),
                        c(i, d, e),
                        i.select()
                    }) : (i.setStart(j, 0).collapse(!0), c(i, d, e), i.select())
                  } else i.insertNode(g),
                  f[a] && (i.selectNode(g).select(), h.execCommand("removeFormat", "span,a", b, null), j = domUtils.findParentByTagName(g, "span", !0), i.setStartBefore(g)),
                  j && (j.style.cssText += ";" + b + ":" + e),
                    i.collapse(!0).select();
                  domUtils.remove(g)
                } else f[a] && h.queryCommandValue(a) && h.execCommand("removeFormat", "span,a", b),
                  i = h.selection.getRange(),
                  i.applyInlineStyle("span", {
                    style: b + ":" + e
                  }),
                  c(i, d, e),
                  i.select();
                return ! 0
              },
              queryCommandValue: function(a) {
                var c = this.selection.getStart();
                if ("underline" == a || "strikethrough" == a) {
                  for (var d, e = c; e && !domUtils.isBlockElm(e) && !domUtils.isBody(e);) {
                    if (1 == e.nodeType && (d = domUtils.getComputedStyle(e, b), "none" != d)) return d;
                    e = e.parentNode
                  }
                  return "none"
                }
                if ("fontborder" == a) {
                  for (var f, g = c; g && dtd.$inline[g.tagName];) {
                    if ((f = domUtils.getComputedStyle(g, "border")) && /1px/.test(f) && /solid/.test(f)) return f;
                    g = g.parentNode
                  }
                  return ""
                }
                if ("FontSize" == a) {
                  var h = domUtils.getComputedStyle(c, b),
                    g = /^([\d\.]+)(\w+)$/.exec(h);
                  return g ? Math.floor(g[1]) + g[2] : h
                }
                return domUtils.getComputedStyle(c, b)
              },
              queryCommandState: function(a) {
                if (!f[a]) return 0;
                var b = this.queryCommandValue(a);
                return "fontborder" == a ? /1px/.test(b) && /solid/.test(b) : "underline" == a ? /underline/.test(b) : /line\-through/.test(b)
              }
            }
          } (h, e[h])
      },
      UE.plugins.link = function() {
        function a(a) {
          var b = a.startContainer,
            c = a.endContainer; (b = domUtils.findParentByTagName(b, "a", !0)) && a.setStartBefore(b),
          (c = domUtils.findParentByTagName(c, "a", !0)) && a.setEndAfter(c)
        }
        function b(b, c, d) {
          var e = b.cloneRange(),
            f = d.queryCommandValue("link");
          a(b = b.adjustmentBoundary());
          var g = b.startContainer;
          if (1 == g.nodeType && f && (g = g.childNodes[b.startOffset], g && 1 == g.nodeType && "A" == g.tagName && /^(?:https?|ftp|file)\s*:\s*\/\//.test(g[browser.ie ? "innerText": "textContent"]) && (g[browser.ie ? "innerText": "textContent"] = utils.html(c.textValue || c.href))), e.collapsed && !f || (b.removeInlineStyle("a"), e = b.cloneRange()), e.collapsed) {
            var h = b.document.createElement("a"),
              i = "";
            c.textValue ? (i = utils.html(c.textValue), delete c.textValue) : i = utils.html(c.href),
              domUtils.setAttributes(h, c),
              g = domUtils.findParentByTagName(e.startContainer, "a", !0),
            g && domUtils.isInNodeEndBoundary(e, g) && b.setStartAfter(g).collapse(!0),
              h[browser.ie ? "innerText": "textContent"] = i,
              b.insertNode(h).selectNode(h)
          } else b.applyInlineStyle("a", c)
        }
        UE.commands.unlink = {
          execCommand: function() {
            var b, c = this.selection.getRange();
            c.collapsed && !domUtils.findParentByTagName(c.startContainer, "a", !0) || (b = c.createBookmark(), a(c), c.removeInlineStyle("a").moveToBookmark(b).select())
          },
          queryCommandState: function() {
            return ! this.highlight && this.queryCommandValue("link") ? 0 : -1
          }
        },
          UE.commands.link = {
            execCommand: function(a, c) {
              var d;
              c._href && (c._href = utils.unhtml(c._href, /[<">]/g)),
              c.href && (c.href = utils.unhtml(c.href, /[<">]/g)),
              c.textValue && (c.textValue = utils.unhtml(c.textValue, /[<">]/g)),
                b(d = this.selection.getRange(), c, this),
                d.collapse().select(!0)
            },
            queryCommandValue: function() {
              var a, b = this.selection.getRange();
              if (!b.collapsed) {
                b.shrinkBoundary();
                var c = 3 != b.startContainer.nodeType && b.startContainer.childNodes[b.startOffset] ? b.startContainer.childNodes[b.startOffset] : b.startContainer,
                  d = 3 == b.endContainer.nodeType || 0 == b.endOffset ? b.endContainer: b.endContainer.childNodes[b.endOffset - 1],
                  e = b.getCommonAncestor();
                if (a = domUtils.findParentByTagName(e, "a", !0), !a && 1 == e.nodeType) for (var f, g, h, i = e.getElementsByTagName("a"), j = 0; h = i[j++];) if (f = domUtils.getPosition(h, c), g = domUtils.getPosition(h, d), (f & domUtils.POSITION_FOLLOWING || f & domUtils.POSITION_CONTAINS) && (g & domUtils.POSITION_PRECEDING || g & domUtils.POSITION_CONTAINS)) {
                  a = h;
                  break
                }
                return a
              }
              if (a = b.startContainer, a = 1 == a.nodeType ? a: a.parentNode, a && (a = domUtils.findParentByTagName(a, "a", !0)) && !domUtils.isInNodeEndBoundary(b, a)) return a
            },
            queryCommandState: function() {
              var a = this.selection.getRange().getClosedNode(),
                b = a && ("edui-faked-video" == a.className || a.className.indexOf("edui-upload-video") != -1);
              return b ? -1 : 0
            }
          }
      },
      UE.plugins.insertframe = function() {
        function a() {
          b._iframe && delete b._iframe
        }
        var b = this;
        b.addListener("selectionchange",
          function() {
            a()
          })
      },
      UE.commands.scrawl = {
        queryCommandState: function() {
          return browser.ie && browser.version <= 8 ? -1 : 0
        }
      },
      UE.plugins.removeformat = function() {
        var a = this;
        a.setOpt({
          removeFormatTags: "b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var",
          removeFormatAttributes: "class,style,lang,width,height,align,hspace,valign"
        }),
          a.commands.removeformat = {
            execCommand: function(a, b, c, d, e) {
              function f(a) {
                if (3 == a.nodeType || "span" != a.tagName.toLowerCase()) return 0;
                if (browser.ie) {
                  var b = a.attributes;
                  if (b.length) {
                    for (var c = 0,
                           d = b.length; c < d; c++) if (b[c].specified) return 0;
                    return 1
                  }
                }
                return ! a.attributes.length
              }
              function g(a) {
                var b = a.createBookmark();
                if (a.collapsed && a.enlarge(!0), !e) {
                  var d = domUtils.findParentByTagName(a.startContainer, "a", !0);
                  d && a.setStartBefore(d),
                    d = domUtils.findParentByTagName(a.endContainer, "a", !0),
                  d && a.setEndAfter(d)
                }
                for (h = a.createBookmark(), p = h.start; (i = p.parentNode) && !domUtils.isBlockElm(i);) domUtils.breakParent(p, i),
                  domUtils.clearEmptySibling(p);
                if (h.end) {
                  for (p = h.end; (i = p.parentNode) && !domUtils.isBlockElm(i);) domUtils.breakParent(p, i),
                    domUtils.clearEmptySibling(p);
                  for (var g, l = domUtils.getNextDomNode(h.start, !1, m); l && l != h.end;) g = domUtils.getNextDomNode(l, !0, m),
                  dtd.$empty[l.tagName.toLowerCase()] || domUtils.isBookmarkNode(l) || (j.test(l.tagName) ? c ? (domUtils.removeStyle(l, c), f(l) && "text-decoration" != c && domUtils.remove(l, !0)) : domUtils.remove(l, !0) : dtd.$tableContent[l.tagName] || dtd.$list[l.tagName] || (domUtils.removeAttributes(l, k), f(l) && domUtils.remove(l, !0))),
                    l = g
                }
                var n = h.start.parentNode; ! domUtils.isBlockElm(n) || dtd.$tableContent[n.tagName] || dtd.$list[n.tagName] || domUtils.removeAttributes(n, k),
                  n = h.end.parentNode,
                h.end && domUtils.isBlockElm(n) && !dtd.$tableContent[n.tagName] && !dtd.$list[n.tagName] && domUtils.removeAttributes(n, k),
                  a.moveToBookmark(h).moveToBookmark(b);
                for (var o, p = a.startContainer,
                       q = a.collapsed; 1 == p.nodeType && domUtils.isEmptyNode(p) && dtd.$removeEmpty[p.tagName];) o = p.parentNode,
                  a.setStartBefore(p),
                a.startContainer === a.endContainer && a.endOffset--,
                  domUtils.remove(p),
                  p = o;
                if (!q) for (p = a.endContainer; 1 == p.nodeType && domUtils.isEmptyNode(p) && dtd.$removeEmpty[p.tagName];) o = p.parentNode,
                  a.setEndBefore(p),
                  domUtils.remove(p),
                  p = o
              }
              var h, i, j = new RegExp("^(?:" + (b || this.options.removeFormatTags).replace(/,/g, "|") + ")$", "i"),
                k = c ? [] : (d || this.options.removeFormatAttributes).split(","),
                l = new dom.Range(this.document),
                m = function(a) {
                  return 1 == a.nodeType
                };
              l = this.selection.getRange(),
                g(l),
                l.select()
            }
          }
      },
      UE.plugins.blockquote = function() {
        function a(a) {
          return domUtils.filterNodeList(a.selection.getStartElementPath(), "blockquote")
        }
        var b = this;
        b.commands.blockquote = {
          execCommand: function(b, c) {
            var d = this.selection.getRange(),
              e = a(this),
              f = dtd.blockquote,
              g = d.createBookmark();
            if (e) {
              var h = d.startContainer,
                i = domUtils.isBlockElm(h) ? h: domUtils.findParent(h,
                  function(a) {
                    return domUtils.isBlockElm(a)
                  }),
                j = d.endContainer,
                k = domUtils.isBlockElm(j) ? j: domUtils.findParent(j,
                  function(a) {
                    return domUtils.isBlockElm(a)
                  });
              i = domUtils.findParentByTagName(i, "li", !0) || i,
                k = domUtils.findParentByTagName(k, "li", !0) || k,
                "LI" == i.tagName || "TD" == i.tagName || i === e || domUtils.isBody(i) ? domUtils.remove(e, !0) : domUtils.breakParent(i, e),
              i !== k && (e = domUtils.findParentByTagName(k, "blockquote"), e && ("LI" == k.tagName || "TD" == k.tagName || domUtils.isBody(k) ? e.parentNode && domUtils.remove(e, !0) : domUtils.breakParent(k, e)));
              for (var l, m = domUtils.getElementsByTagName(this.document, "blockquote"), n = 0; l = m[n++];) l.childNodes.length ? domUtils.getPosition(l, i) & domUtils.POSITION_FOLLOWING && domUtils.getPosition(l, k) & domUtils.POSITION_PRECEDING && domUtils.remove(l, !0) : domUtils.remove(l)
            } else {
              for (var o = d.cloneRange(), p = 1 == o.startContainer.nodeType ? o.startContainer: o.startContainer.parentNode, q = p, r = 1;;) {
                if (domUtils.isBody(p)) {
                  q !== p ? d.collapsed ? (o.selectNode(q), r = 0) : o.setStartBefore(q) : o.setStart(p, 0);
                  break
                }
                if (!f[p.tagName]) {
                  d.collapsed ? o.selectNode(q) : o.setStartBefore(q);
                  break
                }
                q = p,
                  p = p.parentNode
              }
              if (r) for (q = p = p = 1 == o.endContainer.nodeType ? o.endContainer: o.endContainer.parentNode;;) {
                if (domUtils.isBody(p)) {
                  q !== p ? o.setEndAfter(q) : o.setEnd(p, p.childNodes.length);
                  break
                }
                if (!f[p.tagName]) {
                  o.setEndAfter(q);
                  break
                }
                q = p,
                  p = p.parentNode
              }
              p = d.document.createElement("blockquote"),
                domUtils.setAttributes(p, c),
                p.appendChild(o.extractContents()),
                o.insertNode(p);
              for (var s, t = domUtils.getElementsByTagName(p, "blockquote"), n = 0; s = t[n++];) s.parentNode && domUtils.remove(s, !0)
            }
            d.moveToBookmark(g).select()
          },
          queryCommandState: function() {
            return a(this) ? 1 : 0
          }
        }
      },
      UE.commands.touppercase = UE.commands.tolowercase = {
        execCommand: function(a) {
          var b = this,
            c = b.selection.getRange();
          if (c.collapsed) return c;
          for (var d = c.createBookmark(), e = d.end, f = function(a) {
              return ! domUtils.isBr(a) && !domUtils.isWhitespace(a)
            },
                 g = domUtils.getNextDomNode(d.start, !1, f); g && domUtils.getPosition(g, e) & domUtils.POSITION_PRECEDING && (3 == g.nodeType && (g.nodeValue = g.nodeValue["touppercase" == a ? "toUpperCase": "toLowerCase"]()), g = domUtils.getNextDomNode(g, !0, f), g !== e););
          c.moveToBookmark(d).select()
        }
      },
      UE.commands.indent = {
        execCommand: function() {
          var a = this,
            b = a.queryCommandState("indent") ? "0em": a.options.indentValue || "2em";
          a.execCommand("Paragraph", "p", {
            style: "text-indent:" + b
          })
        },
        queryCommandState: function() {
          var a = domUtils.filterNodeList(this.selection.getStartElementPath(), "p h1 h2 h3 h4 h5 h6");
          return a && a.style.textIndent && parseInt(a.style.textIndent) ? 1 : 0
        }
      },
      UE.commands.print = {
        execCommand: function() {
          this.window.print()
        },
        notNeedUndo: 1
      },
      UE.commands.preview = {
        execCommand: function() {
          var a = window.open("", "_blank", ""),
            b = a.document;
          b.open(),
            b.write('<!DOCTYPE html><html><head><meta charset="utf-8"/><script src="' + this.options.UEDITOR_HOME_URL + "ueditor.parse.js\"></script><script>setTimeout(function(){uParse('div',{rootPath: '" + this.options.UEDITOR_HOME_URL + "'})},300)</script></head><body><div>" + this.getContent(null, null, !0) + "</div></body></html>"),
            b.close()
        },
        notNeedUndo: 1
      },
      UE.plugins.selectall = function() {
        var a = this;
        a.commands.selectall = {
          execCommand: function() {
            var a = this,
              b = a.body,
              c = a.selection.getRange();
            c.selectNodeContents(b),
            domUtils.isEmptyBlock(b) && (browser.opera && b.firstChild && 1 == b.firstChild.nodeType && c.setStartAtFirst(b.firstChild), c.collapse(!0)),
              c.select(!0)
          },
          notNeedUndo: 1
        },
          a.addshortcutkey({
            selectAll: "ctrl+65"
          })
      },
      UE.plugins.paragraph = function() {
        var a = this,
          b = domUtils.isBlockElm,
          c = ["TD", "LI", "PRE"],
          d = function(a, d, e, f) {
            var g, h = a.createBookmark(),
              i = function(a) {
                return 1 == a.nodeType ? "br" != a.tagName.toLowerCase() && !domUtils.isBookmarkNode(a) : !domUtils.isWhitespace(a)
              };
            a.enlarge(!0);
            for (var j, k = a.createBookmark(), l = domUtils.getNextDomNode(k.start, !1, i), m = a.cloneRange(); l && !(domUtils.getPosition(l, k.end) & domUtils.POSITION_FOLLOWING);) if (3 != l.nodeType && b(l)) l = domUtils.getNextDomNode(l, !0, i);
            else {
              for (m.setStartBefore(l); l && l !== k.end && !b(l);) j = l,
                l = domUtils.getNextDomNode(l, !1, null,
                  function(a) {
                    return ! b(a)
                  });
              m.setEndAfter(j),
                g = a.document.createElement(d),
              e && (domUtils.setAttributes(g, e), f && "customstyle" == f && e.style && (g.style.cssText = e.style)),
                g.appendChild(m.extractContents()),
              domUtils.isEmptyNode(g) && domUtils.fillChar(a.document, g),
                m.insertNode(g);
              var n = g.parentNode;
              b(n) && !domUtils.isBody(g.parentNode) && utils.indexOf(c, n.tagName) == -1 && (f && "customstyle" == f || (n.getAttribute("dir") && g.setAttribute("dir", n.getAttribute("dir")), n.style.cssText && (g.style.cssText = n.style.cssText + ";" + g.style.cssText), n.style.textAlign && !g.style.textAlign && (g.style.textAlign = n.style.textAlign), n.style.textIndent && !g.style.textIndent && (g.style.textIndent = n.style.textIndent), n.style.padding && !g.style.padding && (g.style.padding = n.style.padding)), e && /h\d/i.test(n.tagName) && !/h\d/i.test(g.tagName) ? (domUtils.setAttributes(n, e), f && "customstyle" == f && e.style && (n.style.cssText = e.style), domUtils.remove(g, !0), g = n) : domUtils.remove(g.parentNode, !0)),
                l = utils.indexOf(c, n.tagName) != -1 ? n: g,
                l = domUtils.getNextDomNode(l, !1, i)
            }
            return a.moveToBookmark(k).moveToBookmark(h)
          };
        a.setOpt("paragraph", {
          p: "",
          h1: "",
          h2: "",
          h3: "",
          h4: "",
          h5: "",
          h6: ""
        }),
          a.commands.paragraph = {
            execCommand: function(a, b, c, e) {
              var f = this.selection.getRange();
              if (f.collapsed) {
                var g = this.document.createTextNode("p");
                if (f.insertNode(g), browser.ie) {
                  var h = g.previousSibling;
                  h && domUtils.isWhitespace(h) && domUtils.remove(h),
                    h = g.nextSibling,
                  h && domUtils.isWhitespace(h) && domUtils.remove(h)
                }
              }
              if (f = d(f, b, c, e), g && (f.setStartBefore(g).collapse(!0), pN = g.parentNode, domUtils.remove(g), domUtils.isBlockElm(pN) && domUtils.isEmptyNode(pN) && domUtils.fillNode(this.document, pN)), browser.gecko && f.collapsed && 1 == f.startContainer.nodeType) {
                var i = f.startContainer.childNodes[f.startOffset];
                i && 1 == i.nodeType && i.tagName.toLowerCase() == b && f.setStart(i, 0).collapse(!0)
              }
              return f.select(),
                !0
            },
            queryCommandValue: function() {
              var a = domUtils.filterNodeList(this.selection.getStartElementPath(), "p h1 h2 h3 h4 h5 h6");
              return a ? a.tagName.toLowerCase() : ""
            }
          }
      },
      function() {
        var a = domUtils.isBlockElm,
          b = function(a) {
            return domUtils.filterNodeList(a.selection.getStartElementPath(),
              function(a) {
                return a && 1 == a.nodeType && a.getAttribute("dir")
              })
          },
          c = function(c, d, e) {
            var f, g = function(a) {
                return 1 == a.nodeType ? !domUtils.isBookmarkNode(a) : !domUtils.isWhitespace(a)
              },
              h = b(d);
            if (h && c.collapsed) return h.setAttribute("dir", e),
              c;
            f = c.createBookmark(),
              c.enlarge(!0);
            for (var i, j = c.createBookmark(), k = domUtils.getNextDomNode(j.start, !1, g), l = c.cloneRange(); k && !(domUtils.getPosition(k, j.end) & domUtils.POSITION_FOLLOWING);) if (3 != k.nodeType && a(k)) k = domUtils.getNextDomNode(k, !0, g);
            else {
              for (l.setStartBefore(k); k && k !== j.end && !a(k);) i = k,
                k = domUtils.getNextDomNode(k, !1, null,
                  function(b) {
                    return ! a(b)
                  });
              l.setEndAfter(i);
              var m = l.getCommonAncestor();
              if (!domUtils.isBody(m) && a(m)) m.setAttribute("dir", e),
                k = m;
              else {
                var n = c.document.createElement("p");
                n.setAttribute("dir", e);
                var o = l.extractContents();
                n.appendChild(o),
                  l.insertNode(n),
                  k = n
              }
              k = domUtils.getNextDomNode(k, !1, g)
            }
            return c.moveToBookmark(j).moveToBookmark(f)
          };
        UE.commands.directionality = {
          execCommand: function(a, b) {
            var d = this.selection.getRange();
            if (d.collapsed) {
              var e = this.document.createTextNode("d");
              d.insertNode(e)
            }
            return c(d, this, b),
            e && (d.setStartBefore(e).collapse(!0), domUtils.remove(e)),
              d.select(),
              !0
          },
          queryCommandValue: function() {
            var a = b(this);
            return a ? a.getAttribute("dir") : "ltr"
          }
        }
      } (),
      UE.plugins.horizontal = function() {
        var a = this;
        a.commands.horizontal = {
          execCommand: function(a) {
            var b = this;
            if (b.queryCommandState(a) !== -1) {
              b.execCommand("insertHtml", "<hr>");
              var c = b.selection.getRange(),
                d = c.startContainer;
              if (1 == d.nodeType && !d.childNodes[c.startOffset]) {
                var e; (e = d.childNodes[c.startOffset - 1]) && 1 == e.nodeType && "HR" == e.tagName && ("p" == b.options.enterTag ? (e = b.document.createElement("p"), c.insertNode(e), c.setStart(e, 0).setCursor()) : (e = b.document.createElement("br"), c.insertNode(e), c.setStartBefore(e).setCursor()))
              }
              return ! 0
            }
          },
          queryCommandState: function() {
            return domUtils.filterNodeList(this.selection.getStartElementPath(), "table") ? -1 : 0
          }
        },
          a.addListener("delkeydown",
            function(a, b) {
              var c = this.selection.getRange();
              if (c.txtToElmBoundary(!0), domUtils.isStartInblock(c)) {
                var d = c.startContainer,
                  e = d.previousSibling;
                if (e && domUtils.isTagNode(e, "hr")) return domUtils.remove(e),
                  c.select(),
                  domUtils.preventDefault(b),
                  !0
              }
            })
      },
      UE.commands.time = UE.commands.date = {
        execCommand: function(a, b) {
          function c(a, b) {
            var c = ("0" + a.getHours()).slice( - 2),
              d = ("0" + a.getMinutes()).slice( - 2),
              e = ("0" + a.getSeconds()).slice( - 2);
            return b = b || "hh:ii:ss",
              b.replace(/hh/gi, c).replace(/ii/gi, d).replace(/ss/gi, e)
          }
          function d(a, b) {
            var c = ("000" + a.getFullYear()).slice( - 4),
              d = c.slice( - 2),
              e = ("0" + (a.getMonth() + 1)).slice( - 2),
              f = ("0" + a.getDate()).slice( - 2);
            return b = b || "yyyy-mm-dd",
              b.replace(/yyyy/gi, c).replace(/yy/gi, d).replace(/mm/gi, e).replace(/dd/gi, f)
          }
          var e = new Date;
          this.execCommand("insertHtml", "time" == a ? c(e, b) : d(e, b))
        }
      },
      UE.plugins.rowspacing = function() {
        var a = this;
        a.setOpt({
          rowspacingtop: ["5", "10", "15", "20", "25"],
          rowspacingbottom: ["5", "10", "15", "20", "25"]
        }),
          a.commands.rowspacing = {
            execCommand: function(a, b, c) {
              return this.execCommand("paragraph", "p", {
                style: "margin-" + c + ":" + b + "px"
              }),
                !0
            },
            queryCommandValue: function(a, b) {
              var c, d = domUtils.filterNodeList(this.selection.getStartElementPath(),
                function(a) {
                  return domUtils.isBlockElm(a)
                });
              return d ? (c = domUtils.getComputedStyle(d, "margin-" + b).replace(/[^\d]/g, ""), c ? c: 0) : 0
            }
          }
      },
      UE.plugins.lineheight = function() {
        var a = this;
        a.setOpt({
          lineheight: ["1", "1.5", "1.75", "2", "3", "4", "5"]
        }),
          a.commands.lineheight = {
            execCommand: function(a, b) {
              return this.execCommand("paragraph", "p", {
                style: "line-height:" + ("1" == b ? "normal": b + "em")
              }),
                !0
            },
            queryCommandValue: function() {
              var a = domUtils.filterNodeList(this.selection.getStartElementPath(),
                function(a) {
                  return domUtils.isBlockElm(a)
                });
              if (a) {
                var b = domUtils.getComputedStyle(a, "line-height");
                return "normal" == b ? 1 : b.replace(/[^\d.]*/gi, "")
              }
            }
          }
      },
      UE.plugins.insertcode = function() {
        var a = this;
        a.ready(function() {
          utils.cssRule("pre", "pre{margin:.5em 0;padding:.4em .6em;border-radius:8px;background:#f8f8f8;}", a.document)
        }),
          a.setOpt("insertcode", {
            as3: "ActionScript3",
            bash: "Bash/Shell",
            cpp: "C/C++",
            css: "Css",
            cf: "CodeFunction",
            "c#": "C#",
            delphi: "Delphi",
            diff: "Diff",
            erlang: "Erlang",
            groovy: "Groovy",
            html: "Html",
            java: "Java",
            jfx: "JavaFx",
            js: "Javascript",
            pl: "Perl",
            php: "Php",
            plain: "Plain Text",
            ps: "PowerShell",
            python: "Python",
            ruby: "Ruby",
            scala: "Scala",
            sql: "Sql",
            vb: "Vb",
            xml: "Xml"
          }),
          a.commands.insertcode = {
            execCommand: function(a, b) {
              var c = this,
                d = c.selection.getRange(),
                e = domUtils.findParentByTagName(d.startContainer, "pre", !0);
              if (e) e.className = "brush:" + b + ";toolbar:false;";
              else {
                var f = "";
                if (d.collapsed) f = browser.ie && browser.ie11below ? browser.version <= 8 ? "&nbsp;": "": "<br/>";
                else {
                  var g = d.extractContents(),
                    h = c.document.createElement("div");
                  h.appendChild(g),
                    utils.each(UE.filterNode(UE.htmlparser(h.innerHTML.replace(/[\r\t]/g, "")), c.options.filterTxtRules).children,
                      function(a) {
                        if (browser.ie && browser.ie11below && browser.version > 8)"element" == a.type ? "br" == a.tagName ? f += "\n": dtd.$empty[a.tagName] || (utils.each(a.children,
                          function(b) {
                            "element" == b.type ? "br" == b.tagName ? f += "\n": dtd.$empty[a.tagName] || (f += b.innerText()) : f += b.data
                          }), /\n$/.test(f) || (f += "\n")) : f += a.data + "\n",
                        !a.nextSibling() && /\n$/.test(f) && (f = f.replace(/\n$/, ""));
                        else if (browser.ie && browser.ie11below)"element" == a.type ? "br" == a.tagName ? f += "<br>": dtd.$empty[a.tagName] || (utils.each(a.children,
                          function(b) {
                            "element" == b.type ? "br" == b.tagName ? f += "<br>": dtd.$empty[a.tagName] || (f += b.innerText()) : f += b.data
                          }), /br>$/.test(f) || (f += "<br>")) : f += a.data + "<br>",
                        !a.nextSibling() && /<br>$/.test(f) && (f = f.replace(/<br>$/, ""));
                        else if (f += "element" == a.type ? dtd.$empty[a.tagName] ? "": a.innerText() : a.data, !/br\/?\s*>$/.test(f)) {
                          if (!a.nextSibling()) return;
                          f += "<br>"
                        }
                      })
                }
                c.execCommand("inserthtml", '<pre id="coder"class="brush:' + b + ';toolbar:false">' + f + "</pre>", !0),
                  e = c.document.getElementById("coder"),
                  domUtils.removeAttributes(e, "id");
                var i = e.previousSibling;
                i && (3 == i.nodeType && 1 == i.nodeValue.length && browser.ie && 6 == browser.version || domUtils.isEmptyBlock(i)) && domUtils.remove(i);
                var d = c.selection.getRange();
                domUtils.isEmptyBlock(e) ? d.setStart(e, 0).setCursor(!1, !0) : d.selectNodeContents(e).select()
              }
            },
            queryCommandValue: function() {
              var a = this.selection.getStartElementPath(),
                b = "";
              return utils.each(a,
                function(a) {
                  if ("PRE" == a.nodeName) {
                    var c = a.className.match(/brush:([^;]+)/);
                    return b = c && c[1] ? c[1] : "",
                      !1
                  }
                }),
                b
            }
          },
          a.addInputRule(function(a) {
            utils.each(a.getNodesByTagName("pre"),
              function(a) {
                var b = a.getNodesByTagName("br");
                if (b.length) return void(browser.ie && browser.ie11below && browser.version > 8 && utils.each(b,
                  function(a) {
                    var b = UE.uNode.createText("\n");
                    a.parentNode.insertBefore(b, a),
                      a.parentNode.removeChild(a)
                  }));
                if (! (browser.ie && browser.ie11below && browser.version > 8)) {
                  var c = a.innerText().split(/\n/);
                  a.innerHTML(""),
                    utils.each(c,
                      function(b) {
                        b.length && a.appendChild(UE.uNode.createText(b)),
                          a.appendChild(UE.uNode.createElement("br"))
                      })
                }
              })
          }),
          a.addOutputRule(function(a) {
            utils.each(a.getNodesByTagName("pre"),
              function(a) {
                var b = "";
                utils.each(a.children,
                  function(a) {
                    b += "text" == a.type ? a.data.replace(/[ ]/g, "&nbsp;").replace(/\n$/, "") : "br" == a.tagName ? "\n": dtd.$empty[a.tagName] ? a.innerText() : ""
                  }),
                  a.innerText(b.replace(/(&nbsp;|\n)+$/, ""))
              })
          }),
          a.notNeedCodeQuery = {
            help: 1,
            undo: 1,
            redo: 1,
            source: 1,
            print: 1,
            searchreplace: 1,
            fullscreen: 1,
            preview: 1,
            insertparagraph: 1,
            elementpath: 1,
            insertcode: 1,
            inserthtml: 1,
            selectall: 1
          };
        a.queryCommandState;
        a.queryCommandState = function(a) {
          var b = this;
          return ! b.notNeedCodeQuery[a.toLowerCase()] && b.selection && b.queryCommandValue("insertcode") ? -1 : UE.Editor.prototype.queryCommandState.apply(this, arguments)
        },
          a.addListener("beforeenterkeydown",
            function() {
              var b = a.selection.getRange(),
                c = domUtils.findParentByTagName(b.startContainer, "pre", !0);
              if (c) {
                if (a.fireEvent("saveScene"), b.collapsed || b.deleteContents(), !browser.ie || browser.ie9above) {
                  var c, d = a.document.createElement("br");
                  b.insertNode(d).setStartAfter(d).collapse(!0);
                  var e = d.nextSibling;
                  e || browser.ie && !(browser.version > 10) ? b.setStartAfter(d) : b.insertNode(d.cloneNode(!1)),
                    c = d.previousSibling;
                  for (var f; c;) if (f = c, c = c.previousSibling, !c || "BR" == c.nodeName) {
                    c = f;
                    break
                  }
                  if (c) {
                    for (var g = ""; c && "BR" != c.nodeName && new RegExp("^[\\s" + domUtils.fillChar + "]*$").test(c.nodeValue);) g += c.nodeValue,
                      c = c.nextSibling;
                    if ("BR" != c.nodeName) {
                      var h = c.nodeValue.match(new RegExp("^([\\s" + domUtils.fillChar + "]+)"));
                      h && h[1] && (g += h[1])
                    }
                    g && (g = a.document.createTextNode(g), b.insertNode(g).setStartAfter(g))
                  }
                  b.collapse(!0).select(!0)
                } else if (browser.version > 8) {
                  var i = a.document.createTextNode("\n"),
                    j = b.startContainer;
                  if (0 == b.startOffset) {
                    var k = j.previousSibling;
                    if (k) {
                      b.insertNode(i);
                      var l = a.document.createTextNode(" ");
                      b.setStartAfter(i).insertNode(l).setStart(l, 0).collapse(!0).select(!0)
                    }
                  } else {
                    b.insertNode(i).setStartAfter(i);
                    var l = a.document.createTextNode(" ");
                    j = b.startContainer.childNodes[b.startOffset],
                    j && !/^\n/.test(j.nodeValue) && b.setStartBefore(i),
                      b.insertNode(l).setStart(l, 0).collapse(!0).select(!0)
                  }
                } else {
                  var d = a.document.createElement("br");
                  b.insertNode(d),
                    b.insertNode(a.document.createTextNode(domUtils.fillChar)),
                    b.setStartAfter(d),
                    c = d.previousSibling;
                  for (var f; c;) if (f = c, c = c.previousSibling, !c || "BR" == c.nodeName) {
                    c = f;
                    break
                  }
                  if (c) {
                    for (var g = ""; c && "BR" != c.nodeName && new RegExp("^[ " + domUtils.fillChar + "]*$").test(c.nodeValue);) g += c.nodeValue,
                      c = c.nextSibling;
                    if ("BR" != c.nodeName) {
                      var h = c.nodeValue.match(new RegExp("^([ " + domUtils.fillChar + "]+)"));
                      h && h[1] && (g += h[1])
                    }
                    g = a.document.createTextNode(g),
                      b.insertNode(g).setStartAfter(g)
                  }
                  b.collapse(!0).select()
                }
                return a.fireEvent("saveScene"),
                  !0
              }
            }),
          a.addListener("tabkeydown",
            function(b, c) {
              var d = a.selection.getRange(),
                e = domUtils.findParentByTagName(d.startContainer, "pre", !0);
              if (e) {
                if (a.fireEvent("saveScene"), c.shiftKey);
                else if (d.collapsed) {
                  var f = a.document.createTextNode("    ");
                  d.insertNode(f).setStartAfter(f).collapse(!0).select(!0)
                } else {
                  for (var g = d.createBookmark(), h = g.start.previousSibling; h;) {
                    if (e.firstChild === h && !domUtils.isBr(h)) {
                      e.insertBefore(a.document.createTextNode("    "), h);
                      break
                    }
                    if (domUtils.isBr(h)) {
                      e.insertBefore(a.document.createTextNode("    "), h.nextSibling);
                      break
                    }
                    h = h.previousSibling
                  }
                  var i = g.end;
                  for (h = g.start.nextSibling, e.firstChild === g.start && e.insertBefore(a.document.createTextNode("    "), h.nextSibling); h && h !== i;) {
                    if (domUtils.isBr(h) && h.nextSibling) {
                      if (h.nextSibling === i) break;
                      e.insertBefore(a.document.createTextNode("    "), h.nextSibling)
                    }
                    h = h.nextSibling
                  }
                  d.moveToBookmark(g).select()
                }
                return a.fireEvent("saveScene"),
                  !0
              }
            }),
          a.addListener("beforeinserthtml",
            function(a, b) {
              var c = this,
                d = c.selection.getRange(),
                e = domUtils.findParentByTagName(d.startContainer, "pre", !0);
              if (e) {
                d.collapsed || d.deleteContents();
                var f = "";
                if (browser.ie && browser.version > 8) {
                  utils.each(UE.filterNode(UE.htmlparser(b), c.options.filterTxtRules).children,
                    function(a) {
                      "element" == a.type ? "br" == a.tagName ? f += "\n": dtd.$empty[a.tagName] || (utils.each(a.children,
                        function(b) {
                          "element" == b.type ? "br" == b.tagName ? f += "\n": dtd.$empty[a.tagName] || (f += b.innerText()) : f += b.data
                        }), /\n$/.test(f) || (f += "\n")) : f += a.data + "\n",
                      !a.nextSibling() && /\n$/.test(f) && (f = f.replace(/\n$/, ""))
                    });
                  var g = c.document.createTextNode(utils.html(f.replace(/&nbsp;/g, " ")));
                  d.insertNode(g).selectNode(g).select()
                } else {
                  var h = c.document.createDocumentFragment();
                  utils.each(UE.filterNode(UE.htmlparser(b), c.options.filterTxtRules).children,
                    function(a) {
                      "element" == a.type ? "br" == a.tagName ? h.appendChild(c.document.createElement("br")) : dtd.$empty[a.tagName] || (utils.each(a.children,
                        function(b) {
                          "element" == b.type ? "br" == b.tagName ? h.appendChild(c.document.createElement("br")) : dtd.$empty[a.tagName] || h.appendChild(c.document.createTextNode(utils.html(b.innerText().replace(/&nbsp;/g, " ")))) : h.appendChild(c.document.createTextNode(utils.html(b.data.replace(/&nbsp;/g, " "))))
                        }), "BR" != h.lastChild.nodeName && h.appendChild(c.document.createElement("br"))) : h.appendChild(c.document.createTextNode(utils.html(a.data.replace(/&nbsp;/g, " ")))),
                      a.nextSibling() || "BR" != h.lastChild.nodeName || h.removeChild(h.lastChild)
                    }),
                    d.insertNode(h).select()
                }
                return ! 0
              }
            }),
          a.addListener("keydown",
            function(a, b) {
              var c = this,
                d = b.keyCode || b.which;
              if (40 == d) {
                var e, f = c.selection.getRange(),
                  g = f.startContainer;
                if (f.collapsed && (e = domUtils.findParentByTagName(f.startContainer, "pre", !0)) && !e.nextSibling) {
                  for (var h = e.lastChild; h && "BR" == h.nodeName;) h = h.previousSibling; (h === g || f.startContainer === e && f.startOffset == e.childNodes.length) && (c.execCommand("insertparagraph"), domUtils.preventDefault(b))
                }
              }
            }),
          a.addListener("delkeydown",
            function(b, c) {
              var d = this.selection.getRange();
              d.txtToElmBoundary(!0);
              var e = d.startContainer;
              if (domUtils.isTagNode(e, "pre") && d.collapsed && domUtils.isStartInblock(d)) {
                var f = a.document.createElement("p");
                return domUtils.fillNode(a.document, f),
                  e.parentNode.insertBefore(f, e),
                  domUtils.remove(e),
                  d.setStart(f, 0).setCursor(!1, !0),
                  domUtils.preventDefault(c),
                  !0
              }
            })
      },
      UE.commands.cleardoc = {
        execCommand: function(a) {
          var b = this,
            c = b.options.enterTag,
            d = b.selection.getRange();
          "br" == c ? (b.body.innerHTML = "<br/>", d.setStart(b.body, 0).setCursor()) : (b.body.innerHTML = "<p>" + (ie ? "": "<br/>") + "</p>", d.setStart(b.body.firstChild, 0).setCursor(!1, !0)),
            setTimeout(function() {
                b.fireEvent("clearDoc")
              },
              0)
        }
      },
      UE.plugin.register("anchor",
        function() {
          return {
            bindEvents: {
              ready: function() {
                utils.cssRule("anchor", ".anchorclass{background: url('" + this.options.themePath + this.options.theme + "/images/anchor.gif') no-repeat scroll left center transparent;cursor: auto;display: inline-block;height: 16px;width: 15px;}", this.document)
              }
            },
            outputRule: function(a) {
              utils.each(a.getNodesByTagName("img"),
                function(a) {
                  var b; (b = a.getAttr("anchorname")) && (a.tagName = "a", a.setAttr({
                    anchorname: "",
                    name: b,
                    "class": ""
                  }))
                })
            },
            inputRule: function(a) {
              utils.each(a.getNodesByTagName("a"),
                function(a) {
                  var b; (b = a.getAttr("name")) && !a.getAttr("href") && (a.tagName = "img", a.setAttr({
                    anchorname: a.getAttr("name"),
                    "class": "anchorclass"
                  }), a.setAttr("name"))
                })
            },
            commands: {
              anchor: {
                execCommand: function(a, b) {
                  var c = this.selection.getRange(),
                    d = c.getClosedNode();
                  if (d && d.getAttribute("anchorname")) b ? d.setAttribute("anchorname", b) : (c.setStartBefore(d).setCursor(), domUtils.remove(d));
                  else if (b) {
                    var e = this.document.createElement("img");
                    c.collapse(!0),
                      domUtils.setAttributes(e, {
                        anchorname: b,
                        "class": "anchorclass"
                      }),
                      c.insertNode(e).setStartAfter(e).setCursor(!1, !0)
                  }
                }
              }
            }
          }
        }),
      UE.plugins.wordcount = function() {
        var a = this;
        a.setOpt("wordCount", !0),
          a.addListener("contentchange",
            function() {
              a.fireEvent("wordcount")
            });
        var b;
        a.addListener("ready",
          function() {
            var a = this;
            domUtils.on(a.body, "keyup",
              function(c) {
                var d = c.keyCode || c.which,
                  e = {
                    16 : 1,
                    18 : 1,
                    20 : 1,
                    37 : 1,
                    38 : 1,
                    39 : 1,
                    40 : 1
                  };
                d in e || (clearTimeout(b), b = setTimeout(function() {
                    a.fireEvent("wordcount")
                  },
                  200))
              })
          })
      },
      UE.plugins.pagebreak = function() {
        function a(a) {
          if (domUtils.isEmptyBlock(a)) {
            for (var b, d = a.firstChild; d && 1 == d.nodeType && domUtils.isEmptyBlock(d);) b = d,
              d = d.firstChild; ! b && (b = a),
              domUtils.fillNode(c.document, b)
          }
        }
        function b(a) {
          return a && 1 == a.nodeType && "HR" == a.tagName && "pagebreak" == a.className
        }
        var c = this,
          d = ["td"];
        c.setOpt("pageBreakTag", "_ueditor_page_break_tag_"),
          c.ready(function() {
            utils.cssRule("pagebreak", ".pagebreak{display:block;clear:both !important;cursor:default !important;width: 100% !important;margin:0;}", c.document)
          }),
          c.addInputRule(function(a) {
            a.traversal(function(a) {
              if ("text" == a.type && a.data == c.options.pageBreakTag) {
                var b = UE.uNode.createElement('<hr class="pagebreak" noshade="noshade" size="5" style="-webkit-user-select: none;">');
                a.parentNode.insertBefore(b, a),
                  a.parentNode.removeChild(a)
              }
            })
          }),
          c.addOutputRule(function(a) {
            utils.each(a.getNodesByTagName("hr"),
              function(a) {
                if ("pagebreak" == a.getAttr("class")) {
                  var b = UE.uNode.createText(c.options.pageBreakTag);
                  a.parentNode.insertBefore(b, a),
                    a.parentNode.removeChild(a)
                }
              })
          }),
          c.commands.pagebreak = {
            execCommand: function() {
              var e = c.selection.getRange(),
                f = c.document.createElement("hr");
              domUtils.setAttributes(f, {
                "class": "pagebreak",
                noshade: "noshade",
                size: "5"
              }),
                domUtils.unSelectable(f);
              var g, h = domUtils.findParentByTagName(e.startContainer, d, !0),
                i = [];
              if (h) switch (h.tagName) {
                case "TD":
                  if (g = h.parentNode, g.previousSibling) g.parentNode.insertBefore(f, g),
                    i = domUtils.findParents(f);
                  else {
                    var j = domUtils.findParentByTagName(g, "table");
                    j.parentNode.insertBefore(f, j),
                      i = domUtils.findParents(f, !0)
                  }
                  g = i[1],
                  f !== g && domUtils.breakParent(f, g),
                    c.fireEvent("afteradjusttable", c.document)
              } else {
                if (!e.collapsed) {
                  e.deleteContents();
                  for (var k = e.startContainer; ! domUtils.isBody(k) && domUtils.isBlockElm(k) && domUtils.isEmptyNode(k);) e.setStartBefore(k).collapse(!0),
                    domUtils.remove(k),
                    k = e.startContainer
                }
                e.insertNode(f);
                for (var l, g = f.parentNode; ! domUtils.isBody(g);) domUtils.breakParent(f, g),
                  l = f.nextSibling,
                l && domUtils.isEmptyBlock(l) && domUtils.remove(l),
                  g = f.parentNode;
                l = f.nextSibling;
                var m = f.previousSibling;
                if (b(m) ? domUtils.remove(m) : m && a(m), l) b(l) ? domUtils.remove(l) : a(l),
                  e.setEndAfter(f).collapse(!1);
                else {
                  var n = c.document.createElement("p");
                  f.parentNode.appendChild(n),
                    domUtils.fillNode(c.document, n),
                    e.setStart(n, 0).collapse(!0)
                }
                e.select(!0)
              }
            }
          }
      },
      UE.plugin.register("wordimage",
        function() {
          var a = this,
            b = [];
          return {
            commands: {
              wordimage: {
                execCommand: function() {
                  for (var b, c = domUtils.getElementsByTagName(a.body, "img"), d = [], e = 0; b = c[e++];) {
                    var f = b.getAttribute("word_img");
                    f && d.push(f)
                  }
                  return d
                },
                queryCommandState: function() {
                  b = domUtils.getElementsByTagName(a.body, "img");
                  for (var c, d = 0; c = b[d++];) if (c.getAttribute("word_img")) return 1;
                  return - 1
                },
                notNeedUndo: !0
              }
            },
            inputRule: function(b) {
              utils.each(b.getNodesByTagName("img"),
                function(b) {
                  var c = b.attrs,
                    d = parseInt(c.width) < 128 || parseInt(c.height) < 43,
                    e = a.options,
                    f = e.UEDITOR_HOME_URL + "themes/default/images/spacer.gif";
                  c.src && /^(?:(file:\/+))/.test(c.src) && b.setAttr({
                    width: c.width,
                    height: c.height,
                    alt: c.alt,
                    word_img: c.src,
                    src: f,
                    style: "background:url(" + (d ? e.themePath + e.theme + "/images/word.gif": e.langPath + e.lang + "/images/localimage.png") + ") no-repeat center center;border:1px solid #ddd"
                  })
                })
            }
          }
        }),
      UE.plugins.dragdrop = function() {
        var a = this;
        a.ready(function() {
          domUtils.on(this.body, "dragend",
            function() {
              var b = a.selection.getRange(),
                c = b.getClosedNode() || a.selection.getStart();
              if (c && "IMG" == c.tagName) {
                for (var d, e = c.previousSibling; (d = c.nextSibling) && 1 == d.nodeType && "SPAN" == d.tagName && !d.firstChild;) domUtils.remove(d); (!e || 1 != e.nodeType || domUtils.isEmptyBlock(e)) && e || d && (!d || domUtils.isEmptyBlock(d)) || (e && "P" == e.tagName && !domUtils.isEmptyBlock(e) ? (e.appendChild(c), domUtils.moveChild(d, e), domUtils.remove(d)) : d && "P" == d.tagName && !domUtils.isEmptyBlock(d) && d.insertBefore(c, d.firstChild), e && "P" == e.tagName && domUtils.isEmptyBlock(e) && domUtils.remove(e), d && "P" == d.tagName && domUtils.isEmptyBlock(d) && domUtils.remove(d), b.selectNode(c).select(), a.fireEvent("saveScene"))
              }
            })
        }),
          a.addListener("keyup",
            function(b, c) {
              var d = c.keyCode || c.which;
              if (13 == d) {
                var e, f = a.selection.getRange(); (e = domUtils.findParentByTagName(f.startContainer, "p", !0)) && "center" == domUtils.getComputedStyle(e, "text-align") && domUtils.removeStyle(e, "text-align")
              }
            })
      },
      UE.plugins.undo = function() {
        function a(a, b) {
          if (a.length != b.length) return 0;
          for (var c = 0,
                 d = a.length; c < d; c++) if (a[c] != b[c]) return 0;
          return 1
        }
        function b(b, c) {
          return b.collapsed != c.collapsed ? 0 : a(b.startAddress, c.startAddress) && a(b.endAddress, c.endAddress) ? 1 : 0
        }
        function c() {
          this.list = [],
            this.index = 0,
            this.hasUndo = !1,
            this.hasRedo = !1,
            this.undo = function() {
              if (this.hasUndo) {
                if (!this.list[this.index - 1] && 1 == this.list.length) return void this.reset();
                for (; this.list[this.index].content == this.list[this.index - 1].content;) if (this.index--, 0 == this.index) return this.restore(0);
                this.restore(--this.index)
              }
            },
            this.redo = function() {
              if (this.hasRedo) {
                for (; this.list[this.index].content == this.list[this.index + 1].content;) if (this.index++, this.index == this.list.length - 1) return this.restore(this.index);
                this.restore(++this.index)
              }
            },
            this.restore = function() {
              var a = this.editor,
                b = this.list[this.index],
                c = UE.htmlparser(b.content.replace(h, ""));
              a.options.autoClearEmptyNode = !1,
                a.filterInputRule(c),
                a.options.autoClearEmptyNode = j,
                a.document.body.innerHTML = c.toHtml(),
                a.fireEvent("afterscencerestore"),
              browser.ie && utils.each(domUtils.getElementsByTagName(a.document, "td th caption p"),
                function(b) {
                  domUtils.isEmptyNode(b) && domUtils.fillNode(a.document, b)
                });
              try {
                var d = new dom.Range(a.document).moveToAddress(b.address);
                d.select(i[d.startContainer.nodeName.toLowerCase()])
              } catch(e) {}
              this.update(),
                this.clearKey(),
                a.fireEvent("reset", !0)
            },
            this.getScene = function() {
              var a = this.editor,
                b = a.selection.getRange(),
                c = b.createAddress(!1, !0);
              a.fireEvent("beforegetscene");
              var d = UE.htmlparser(a.body.innerHTML);
              a.options.autoClearEmptyNode = !1,
                a.filterOutputRule(d),
                a.options.autoClearEmptyNode = j;
              var e = d.toHtml();
              return a.fireEvent("aftergetscene"),
                {
                  address: c,
                  content: e
                }
            },
            this.save = function(a, c) {
              clearTimeout(d);
              var g = this.getScene(c),
                h = this.list[this.index];
              h && h.content != g.content && e.trigger("contentchange"),
              h && h.content == g.content && (a ? 1 : b(h.address, g.address)) || (this.list = this.list.slice(0, this.index + 1), this.list.push(g), this.list.length > f && this.list.shift(), this.index = this.list.length - 1, this.clearKey(), this.update())
            },
            this.update = function() {
              this.hasRedo = !!this.list[this.index + 1],
                this.hasUndo = !!this.list[this.index - 1]
            },
            this.reset = function() {
              this.list = [],
                this.index = 0,
                this.hasUndo = !1,
                this.hasRedo = !1,
                this.clearKey()
            },
            this.clearKey = function() {
              m = 0,
                k = null
            }
        }
        var d, e = this,
          f = e.options.maxUndoCount || 20,
          g = e.options.maxInputCount || 20,
          h = new RegExp(domUtils.fillChar + "|</hr>", "gi"),
          i = {
            ol: 1,
            ul: 1,
            table: 1,
            tbody: 1,
            tr: 1,
            body: 1
          },
          j = e.options.autoClearEmptyNode;
        e.undoManger = new c,
          e.undoManger.editor = e,
          e.addListener("saveScene",
            function() {
              var a = Array.prototype.splice.call(arguments, 1);
              this.undoManger.save.apply(this.undoManger, a)
            }),
          e.addListener("reset",
            function(a, b) {
              b || this.undoManger.reset()
            }),
          e.commands.redo = e.commands.undo = {
            execCommand: function(a) {
              this.undoManger[a]()
            },
            queryCommandState: function(a) {
              return this.undoManger["has" + ("undo" == a.toLowerCase() ? "Undo": "Redo")] ? 0 : -1
            },
            notNeedUndo: 1
          };
        var k, l = {
            16 : 1,
            17 : 1,
            18 : 1,
            37 : 1,
            38 : 1,
            39 : 1,
            40 : 1
          },
          m = 0,
          n = !1;
        e.addListener("ready",
          function() {
            domUtils.on(this.body, "compositionstart",
              function() {
                n = !0
              }),
              domUtils.on(this.body, "compositionend",
                function() {
                  n = !1
                })
          }),
          e.addshortcutkey({
            Undo: "ctrl+90",
            Redo: "ctrl+89"
          });
        var o = !0;
        e.addListener("keydown",
          function(a, b) {
            function c(a) {
              a.undoManger.save(!1, !0),
                a.fireEvent("selectionchange")
            }
            var e = this,
              f = b.keyCode || b.which;
            if (! (l[f] || b.ctrlKey || b.metaKey || b.shiftKey || b.altKey)) {
              if (n) return;
              if (!e.selection.getRange().collapsed) return e.undoManger.save(!1, !0),
                void(o = !1);
              0 == e.undoManger.list.length && e.undoManger.save(!0),
                clearTimeout(d),
                d = setTimeout(function() {
                    if (n) var a = setInterval(function() {
                        n || (c(e), clearInterval(a))
                      },
                      300);
                    else c(e)
                  },
                  200),
                k = f,
                m++,
              m >= g && c(e)
            }
          }),
          e.addListener("keyup",
            function(a, b) {
              var c = b.keyCode || b.which;
              if (! (l[c] || b.ctrlKey || b.metaKey || b.shiftKey || b.altKey)) {
                if (n) return;
                o || (this.undoManger.save(!1, !0), o = !0)
              }
            }),
          e.stopCmdUndo = function() {
            e.__hasEnterExecCommand = !0
          },
          e.startCmdUndo = function() {
            e.__hasEnterExecCommand = !1
          }
      },
      UE.plugin.register("copy",
        function() {
          function a() {
            ZeroClipboard.config({
              debug: !1,
              swfPath: b.options.UEDITOR_HOME_URL + "third-party/zeroclipboard/ZeroClipboard.swf"
            });
            var a = b.zeroclipboard = new ZeroClipboard;
            a.on("copy",
              function(a) {
                var c = a.client,
                  d = b.selection.getRange(),
                  e = document.createElement("div");
                e.appendChild(d.cloneContents()),
                  c.setText(e.innerText || e.textContent),
                  c.setHtml(e.innerHTML),
                  d.select()
              }),
              a.on("mouseover mouseout",
                function(a) {
                  var b = a.target;
                  "mouseover" == a.type ? domUtils.addClass(b, "edui-state-hover") : "mouseout" == a.type && domUtils.removeClasses(b, "edui-state-hover")
                }),
              a.on("wrongflash noflash",
                function() {
                  ZeroClipboard.destroy()
                })
          }
          var b = this;
          return {
            bindEvents: {
              ready: function() {
                browser.ie || (window.ZeroClipboard ? a() : utils.loadFile(document, {
                    src: b.options.UEDITOR_HOME_URL + "third-party/zeroclipboard/ZeroClipboard.js",
                    tag: "script",
                    type: "text/javascript",
                    defer: "defer"
                  },
                  function() {
                    a()
                  }))
              }
            },
            commands: {
              copy: {
                execCommand: function(a) {
                  b.document.execCommand("copy") || alert(b.getLang("copymsg"))
                }
              }
            }
          }
        }),
      UE.plugins.paste = function() {
        function a(a) {
          var b = this.document;
          if (!b.getElementById("baidu_pastebin")) {
            var c = this.selection.getRange(),
              d = c.createBookmark(),
              e = b.createElement("div");
            e.id = "baidu_pastebin",
            browser.webkit && e.appendChild(b.createTextNode(domUtils.fillChar + domUtils.fillChar)),
              b.body.appendChild(e),
              d.start.style.display = "",
              e.style.cssText = "position:absolute;width:1px;height:1px;overflow:hidden;left:-1000px;white-space:nowrap;top:" + domUtils.getXY(d.start).y + "px",
              c.selectNodeContents(e).select(!0),
              setTimeout(function() {
                  if (browser.webkit) for (var f, g = 0,
                                             h = b.querySelectorAll("#baidu_pastebin"); f = h[g++];) {
                    if (!domUtils.isEmptyNode(f)) {
                      e = f;
                      break
                    }
                    domUtils.remove(f)
                  }
                  try {
                    e.parentNode.removeChild(e)
                  } catch(i) {}
                  c.moveToBookmark(d).select(!0),
                    a(e)
                },
                0)
          }
        }
        function b(a) {
          return a.replace(/<(\/?)([\w\-]+)([^>]*)>/gi,
            function(a, b, c, d) {
              return c = c.toLowerCase(),
                {
                  img: 1
                } [c] ? a: (d = d.replace(/([\w\-]*?)\s*=\s*(("([^"]*)")|('([^']*)')|([^\s>]+))/gi,
                  function(a, b, c) {
                    return {
                      src: 1,
                      href: 1,
                      name: 1
                    } [b.toLowerCase()] ? b + "=" + c + " ": ""
                  }), {
                  span: 1,
                  div: 1
                } [c] ? "": "<" + b + c + " " + utils.trim(d) + ">")
            })
        }
        function c(a) {
          var c;
          if (a.firstChild) {
            for (var h, i = domUtils.getElementsByTagName(a, "span"), j = 0; h = i[j++];)"_baidu_cut_start" != h.id && "_baidu_cut_end" != h.id || domUtils.remove(h);
            if (browser.webkit) {
              for (var k, l = a.querySelectorAll("div br"), j = 0; k = l[j++];) {
                var m = k.parentNode;
                "DIV" == m.tagName && 1 == m.childNodes.length && (m.innerHTML = "<p><br/></p>", domUtils.remove(m))
              }
              for (var n, o = a.querySelectorAll("#baidu_pastebin"), j = 0; n = o[j++];) {
                var p = d.document.createElement("p");
                for (n.parentNode.insertBefore(p, n); n.firstChild;) p.appendChild(n.firstChild);
                domUtils.remove(n)
              }
              for (var q, r = a.querySelectorAll("meta"), j = 0; q = r[j++];) domUtils.remove(q);
              var l = a.querySelectorAll("br");
              for (j = 0; q = l[j++];) / ^apple - /i.test(q.className)&&domUtils.remove(q)}if(browser.gecko){var s=a.querySelectorAll("[_moz_dirty]");for(j=0;q=s[j++];)q.removeAttribute("_moz_dirty")}if(!browser.ie)for(var q,t=a.querySelectorAll("span.Apple-style-span"),j=0;q=t[j++];)domUtils.remove(q,!0);c=a.innerHTML,c=UE.filterWord(c);var u=UE.htmlparser(c);if(d.options.filterRules&&UE.filterNode(u,d.options.filterRules),d.filterInputRule(u),browser.webkit){var v=u.lastChild();v&&"element"==v.type&&"br"==v.tagName&&u.removeChild(v),utils.each(d.body.querySelectorAll("div"),function(a){domUtils.isEmptyBlock(a)&&domUtils.remove(a,!0)})}if(c={html:u.toHtml()},d.fireEvent("beforepaste",c,u),!c.html)return;u=UE.htmlparser(c.html,!0),1===d.queryCommandState("pasteplain")?d.execCommand("insertHtml",UE.filterNode(u,d.options.filterTxtRules).toHtml(),!0):(UE.filterNode(u,d.options.filterTxtRules),e=u.toHtml(),f=c.html,g=d.selection.getRange().createAddress(!0),d.execCommand("insertHtml",d.getOpt("retainOnlyLabelPasted")===!0?b(f):f,!0)),d.fireEvent("afterpaste",c)}}var d=this;d.setOpt({retainOnlyLabelPasted:!1});var e,f,g;d.addListener("pasteTransfer",function(a,c){if(g&&e&&f&&e!=f){var h=d.selection.getRange();if(h.moveToAddress(g,!0),!h.collapsed){for(;!domUtils.isBody(h.startContainer);){var i=h.startContainer;if(1==i.nodeType){if(i=i.childNodes[h.startOffset],!i){h.setStartBefore(h.startContainer);continue}var j=i.previousSibling;j&&3==j.nodeType&&new RegExp("^[\n\r\t "+domUtils.fillChar+"]*$").test(j.nodeValue)&&h.setStartBefore(j)}if(0!=h.startOffset)break;h.setStartBefore(h.startContainer)}for(;!domUtils.isBody(h.endContainer);){var k=h.endContainer;if(1==k.nodeType){if(k=k.childNodes[h.endOffset],!k){h.setEndAfter(h.endContainer);continue}var l=k.nextSibling;l&&3==l.nodeType&&new RegExp("^[\n\r\t"+domUtils.fillChar+"]*$").test(l.nodeValue)&&h.setEndAfter(l)}if(h.endOffset!=h.endContainer[3==h.endContainer.nodeType?"nodeValue":"childNodes"].length)break;h.setEndAfter(h.endContainer)}}h.deleteContents(),h.select(!0),d.__hasEnterExecCommand=!0;var m=f;2===c?m=b(m):c&&(m=e),d.execCommand("inserthtml",m,!0),d.__hasEnterExecCommand=!1;for(var n=d.selection.getRange();!domUtils.isBody(n.startContainer)&&!n.startOffset&&n.startContainer[3==n.startContainer.nodeType?"nodeValue":"childNodes"].length;)n.setStartBefore(n.startContainer);var o=n.createAddress(!0);g.endAddress=o.startAddress}}),d.addListener("ready",function(){domUtils.on(d.body,"cut",function(){var a=d.selection.getRange();!a.collapsed&&d.undoManger&&d.undoManger.save()}),domUtils.on(d.body,browser.ie||browser.opera?"keydown":"paste",function(b){(!browser.ie&&!browser.opera||(b.ctrlKey||b.metaKey)&&"86"==b.keyCode)&&a.call(d,function(a){c(a)})})}),d.commands.paste={execCommand:function(b){browser.ie?(a.call(d,function(a){c(a)}),d.document.execCommand("paste")):alert(d.getLang("pastemsg"))}}},UE.plugins.pasteplain=function(){var a=this;a.setOpt({pasteplain:!1,filterTxtRules:function(){function a(a){a.tagName="p",a.setStyle()}function b(a){a.parentNode.removeChild(a,!0)}return{"-":"script style object iframe embed input select",p:{$:{}},br:{$:{}},div:function(a){for(var b,c=UE.uNode.createElement("p");b=a.firstChild();)"text"!=b.type&&UE.dom.dtd.$block[b.tagName]?c.firstChild()?(a.parentNode.insertBefore(c,a),c=UE.uNode.createElement("p")):a.parentNode.insertBefore(b,a):c.appendChild(b);c.firstChild()&&a.parentNode.insertBefore(c,a),a.parentNode.removeChild(a)},ol:b,ul:b,dl:b,dt:b,dd:b,li:b,caption:a,th:a,tr:a,h1:a,h2:a,h3:a,h4:a,h5:a,h6:a,td:function(a){var b=!!a.innerText();b&&a.parentNode.insertAfter(UE.uNode.createText(" &nbsp; &nbsp;"),a),a.parentNode.removeChild(a,a.innerText())}}}()});var b=a.options.pasteplain;a.commands.pasteplain={queryCommandState:function(){return b?1:0},execCommand:function(){b=0|!b},notNeedUndo:1}},UE.plugins.list=function(){function a(a){var b=[];for(var c in a)b.push(c);return b}function b(a){var b=a.className;return domUtils.hasClass(a,/custom_ / ) ? b.match(/custom_(\w+)/)[1] : domUtils.getStyle(a, "list-style-type")
    }
      function c(a, c) {
        utils.each(domUtils.getElementsByTagName(a, "ol ul"),
          function(f) {
            if (domUtils.inDoc(f, a)) {
              var g = f.parentNode;
              if (g.tagName == f.tagName) {
                var h = b(f) || ("OL" == f.tagName ? "decimal": "disc"),
                  i = b(g) || ("OL" == g.tagName ? "decimal": "disc");
                if (h == i) {
                  var l = utils.indexOf(k[f.tagName], h);
                  l = l + 1 == k[f.tagName].length ? 0 : l + 1,
                    e(f, k[f.tagName][l])
                }
              }
              var m = 0,
                n = 2;
              domUtils.hasClass(f, /custom_/) ? /[ou]l/i.test(g.tagName) && domUtils.hasClass(g, /custom_/) || (n = 1) : /[ou]l/i.test(g.tagName) && domUtils.hasClass(g, /custom_/) && (n = 3);
              var o = domUtils.getStyle(f, "list-style-type");
              o && (f.style.cssText = "list-style-type:" + o),
                f.className = utils.trim(f.className.replace(/list-paddingleft-\w+/, "")) + " list-paddingleft-" + n,
                utils.each(domUtils.getElementsByTagName(f, "li"),
                  function(a) {
                    if (a.style.cssText && (a.style.cssText = ""), !a.firstChild) return void domUtils.remove(a);
                    if (a.parentNode === f) {
                      if (m++, domUtils.hasClass(f, /custom_/)) {
                        var c = 1,
                          d = b(f);
                        if ("OL" == f.tagName) {
                          if (d) switch (d) {
                            case "cn":
                            case "cn1":
                            case "cn2":
                              m > 10 && (m % 10 == 0 || m > 10 && m < 20) ? c = 2 : m > 20 && (c = 3);
                              break;
                            case "num2":
                              m > 9 && (c = 2)
                          }
                          a.className = "list-" + j[d] + m + " list-" + d + "-paddingleft-" + c
                        } else a.className = "list-" + j[d] + " list-" + d + "-paddingleft"
                      } else a.className = a.className.replace(/list-[\w\-]+/gi, "");
                      var e = a.getAttribute("class");
                      null === e || e.replace(/\s/g, "") || domUtils.removeAttributes(a, "class")
                    }
                  }),
              !c && d(f, f.tagName.toLowerCase(), b(f) || domUtils.getStyle(f, "list-style-type"), !0)
            }
          })
      }
      function d(a, d, e, f) {
        var g = a.nextSibling;
        g && 1 == g.nodeType && g.tagName.toLowerCase() == d && (b(g) || domUtils.getStyle(g, "list-style-type") || ("ol" == d ? "decimal": "disc")) == e && (domUtils.moveChild(g, a), 0 == g.childNodes.length && domUtils.remove(g)),
        g && domUtils.isFillChar(g) && domUtils.remove(g);
        var h = a.previousSibling;
        h && 1 == h.nodeType && h.tagName.toLowerCase() == d && (b(h) || domUtils.getStyle(h, "list-style-type") || ("ol" == d ? "decimal": "disc")) == e && domUtils.moveChild(a, h),
        h && domUtils.isFillChar(h) && domUtils.remove(h),
        !f && domUtils.isEmptyBlock(a) && domUtils.remove(a),
        b(a) && c(a.ownerDocument, !0)
      }
      function e(a, b) {
        j[b] && (a.className = "custom_" + b);
        try {
          domUtils.setStyle(a, "list-style-type", b)
        } catch(c) {}
      }
      function f(a) {
        var b = a.previousSibling;
        b && domUtils.isEmptyBlock(b) && domUtils.remove(b),
          b = a.nextSibling,
        b && domUtils.isEmptyBlock(b) && domUtils.remove(b)
      }
      function g(a) {
        for (; a && !domUtils.isBody(a);) {
          if ("TABLE" == a.nodeName) return null;
          if ("LI" == a.nodeName) return a;
          a = a.parentNode
        }
      }
      var h = this,
        i = {
          TD: 1,
          PRE: 1,
          BLOCKQUOTE: 1
        },
        j = {
          cn: "cn-1-",
          cn1: "cn-2-",
          cn2: "cn-3-",
          num: "num-1-",
          num1: "num-2-",
          num2: "num-3-",
          dash: "dash",
          dot: "dot"
        };
      h.setOpt({
        autoTransWordToList: !1,
        insertorderedlist: {
          num: "",
          num1: "",
          num2: "",
          cn: "",
          cn1: "",
          cn2: "",
          decimal: "",
          "lower-alpha": "",
          "lower-roman": "",
          "upper-alpha": "",
          "upper-roman": ""
        },
        insertunorderedlist: {
          circle: "",
          disc: "",
          square: "",
          dash: "",
          dot: ""
        },
        listDefaultPaddingLeft: "30",
        listiconpath: "http://bs.baidu.com/listicon/",
        maxListLevel: -1,
        disablePInList: !1
      });
      var k = {
          OL: a(h.options.insertorderedlist),
          UL: a(h.options.insertunorderedlist)
        },
        l = h.options.listiconpath;
      for (var m in j) h.options.insertorderedlist.hasOwnProperty(m) || h.options.insertunorderedlist.hasOwnProperty(m) || delete j[m];
      h.ready(function() {
        var a = [];
        for (var b in j) {
          if ("dash" == b || "dot" == b) a.push("li.list-" + j[b] + "{background-image:url(" + l + j[b] + ".gif)}"),
            a.push("ul.custom_" + b + "{list-style:none;}ul.custom_" + b + " li{background-position:0 3px;background-repeat:no-repeat}");
          else {
            for (var c = 0; c < 99; c++) a.push("li.list-" + j[b] + c + "{background-image:url(" + l + "list-" + j[b] + c + ".gif)}");
            a.push("ol.custom_" + b + "{list-style:none;}ol.custom_" + b + " li{background-position:0 3px;background-repeat:no-repeat}")
          }
          switch (b) {
            case "cn":
              a.push("li.list-" + b + "-paddingleft-1{padding-left:25px}"),
                a.push("li.list-" + b + "-paddingleft-2{padding-left:40px}"),
                a.push("li.list-" + b + "-paddingleft-3{padding-left:55px}");
              break;
            case "cn1":
              a.push("li.list-" + b + "-paddingleft-1{padding-left:30px}"),
                a.push("li.list-" + b + "-paddingleft-2{padding-left:40px}"),
                a.push("li.list-" + b + "-paddingleft-3{padding-left:55px}");
              break;
            case "cn2":
              a.push("li.list-" + b + "-paddingleft-1{padding-left:40px}"),
                a.push("li.list-" + b + "-paddingleft-2{padding-left:55px}"),
                a.push("li.list-" + b + "-paddingleft-3{padding-left:68px}");
              break;
            case "num":
            case "num1":
              a.push("li.list-" + b + "-paddingleft-1{padding-left:25px}");
              break;
            case "num2":
              a.push("li.list-" + b + "-paddingleft-1{padding-left:35px}"),
                a.push("li.list-" + b + "-paddingleft-2{padding-left:40px}");
              break;
            case "dash":
              a.push("li.list-" + b + "-paddingleft{padding-left:35px}");
              break;
            case "dot":
              a.push("li.list-" + b + "-paddingleft{padding-left:20px}")
          }
        }
        a.push(".list-paddingleft-1{padding-left:0}"),
          a.push(".list-paddingleft-2{padding-left:" + h.options.listDefaultPaddingLeft + "px}"),
          a.push(".list-paddingleft-3{padding-left:" + 2 * h.options.listDefaultPaddingLeft + "px}"),
          utils.cssRule("list", "ol,ul{margin:0;pading:0;" + (browser.ie ? "": "width:95%") + "}li{clear:both;}" + a.join("\n"), h.document)
      }),
        h.ready(function() {
          domUtils.on(h.body, "cut",
            function() {
              setTimeout(function() {
                var a, b = h.selection.getRange();
                if (!b.collapsed && (a = domUtils.findParentByTagName(b.startContainer, "li", !0)) && !a.nextSibling && domUtils.isEmptyBlock(a)) {
                  var c, d = a.parentNode;
                  if (c = d.previousSibling) domUtils.remove(d),
                    b.setStartAtLast(c).collapse(!0),
                    b.select(!0);
                  else if (c = d.nextSibling) domUtils.remove(d),
                    b.setStartAtFirst(c).collapse(!0),
                    b.select(!0);
                  else {
                    var e = h.document.createElement("p");
                    domUtils.fillNode(h.document, e),
                      d.parentNode.insertBefore(e, d),
                      domUtils.remove(d),
                      b.setStart(e, 0).collapse(!0),
                      b.select(!0)
                  }
                }
              })
            })
        }),
        h.addListener("beforepaste",
          function(a, c) {
            var d, e = this,
              f = e.selection.getRange(),
              g = UE.htmlparser(c.html, !0);
            if (d = domUtils.findParentByTagName(f.startContainer, "li", !0)) {
              var h = d.parentNode,
                i = "OL" == h.tagName ? "ul": "ol";
              utils.each(g.getNodesByTagName(i),
                function(c) {
                  if (c.tagName = h.tagName, c.setAttr(), c.parentNode === g) a = b(h) || ("OL" == h.tagName ? "decimal": "disc");
                  else {
                    var d = c.parentNode.getAttr("class");
                    a = d && /custom_/.test(d) ? d.match(/custom_(\w+)/)[1] : c.parentNode.getStyle("list-style-type"),
                    a || (a = "OL" == h.tagName ? "decimal": "disc")
                  }
                  var e = utils.indexOf(k[h.tagName], a);
                  c.parentNode !== g && (e = e + 1 == k[h.tagName].length ? 0 : e + 1);
                  var f = k[h.tagName][e];
                  j[f] ? c.setAttr("class", "custom_" + f) : c.setStyle("list-style-type", f)
                })
            }
            c.html = g.toHtml()
          }),
      h.getOpt("disablePInList") === !0 && h.addOutputRule(function(a) {
        utils.each(a.getNodesByTagName("li"),
          function(a) {
            var b = [],
              c = 0;
            utils.each(a.children,
              function(d) {
                if ("p" == d.tagName) {
                  for (var e; e = d.children.pop();) b.splice(c, 0, e),
                    e.parentNode = a,
                    lastNode = e;
                  if (e = b[b.length - 1], !e || "element" != e.type || "br" != e.tagName) {
                    var f = UE.uNode.createElement("br");
                    f.parentNode = a,
                      b.push(f)
                  }
                  c = b.length
                }
              }),
            b.length && (a.children = b)
          })
      }),
        h.addInputRule(function(a) {
          function b(a, b) {
            var e = b.firstChild();
            if (e && "element" == e.type && "span" == e.tagName && /Wingdings|Symbol/.test(e.getStyle("font-family"))) {
              for (var f in d) if (d[f] == e.data) return f;
              return "disc"
            }
            for (var f in c) if (c[f].test(a)) return f
          }
          if (utils.each(a.getNodesByTagName("li"),
            function(a) {
              for (var b, c = UE.uNode.createElement("p"), d = 0; b = a.children[d];)"text" == b.type || dtd.p[b.tagName] ? c.appendChild(b) : c.firstChild() ? (a.insertBefore(c, b), c = UE.uNode.createElement("p"), d += 2) : d++; (c.firstChild() && !c.parentNode || !a.firstChild()) && a.appendChild(c),
              c.firstChild() || c.innerHTML(browser.ie ? "&nbsp;": "<br/>");
              var e = a.firstChild(),
                f = e.lastChild();
              f && "text" == f.type && /^\s*$/.test(f.data) && e.removeChild(f)
            }), h.options.autoTransWordToList) {
            var c = {
                num1: /^\d+\)/,
                decimal: /^\d+\./,
                "lower-alpha": /^[a-z]+\)/,
                "upper-alpha": /^[A-Z]+\./,
                cn: /^[\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+[\u3001]/,
                cn2: /^\([\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+\)/
              },
              d = {
                square: "n"
              };
            utils.each(a.getNodesByTagName("p"),
              function(a) {
                function d(a, b, d) {
                  if ("ol" == a.tagName) if (browser.ie) {
                    var e = b.firstChild();
                    "element" == e.type && "span" == e.tagName && c[d].test(e.innerText()) && b.removeChild(e)
                  } else b.innerHTML(b.innerHTML().replace(c[d], ""));
                  else b.removeChild(b.firstChild());
                  var f = UE.uNode.createElement("li");
                  f.appendChild(b),
                    a.appendChild(f)
                }
                if ("MsoListParagraph" == a.getAttr("class")) {
                  a.setStyle("margin", ""),
                    a.setStyle("margin-left", ""),
                    a.setAttr("class", "");
                  var e, f = a,
                    g = a;
                  if ("li" != a.parentNode.tagName && (e = b(a.innerText(), a))) {
                    var i = UE.uNode.createElement(h.options.insertorderedlist.hasOwnProperty(e) ? "ol": "ul");
                    for (j[e] ? i.setAttr("class", "custom_" + e) : i.setStyle("list-style-type", e); a && "li" != a.parentNode.tagName && b(a.innerText(), a);) f = a.nextSibling(),
                    f || a.parentNode.insertBefore(i, a),
                      d(i, a, e),
                      a = f; ! i.parentNode && a && a.parentNode && a.parentNode.insertBefore(i, a)
                  }
                  var k = g.firstChild();
                  k && "element" == k.type && "span" == k.tagName && /^\s*(&nbsp;)+\s*$/.test(k.innerText()) && k.parentNode.removeChild(k)
                }
              })
          }
        }),
        h.addListener("contentchange",
          function() {
            c(h.document)
          }),
        h.addListener("keydown",
          function(a, b) {
            function c() {
              b.preventDefault ? b.preventDefault() : b.returnValue = !1,
                h.fireEvent("contentchange"),
              h.undoManger && h.undoManger.save()
            }
            function d(a, b) {
              for (; a && !domUtils.isBody(a);) {
                if (b(a)) return null;
                if (1 == a.nodeType && /[ou]l/i.test(a.tagName)) return a;
                a = a.parentNode
              }
              return null
            }
            var e = b.keyCode || b.which;
            if (13 == e && !b.shiftKey) {
              var g = h.selection.getRange(),
                i = domUtils.findParent(g.startContainer,
                  function(a) {
                    return domUtils.isBlockElm(a)
                  },
                  !0),
                j = domUtils.findParentByTagName(g.startContainer, "li", !0);
              if (i && "PRE" != i.tagName && !j) {
                var k = i.innerHTML.replace(new RegExp(domUtils.fillChar, "g"), "");
                /^\s*1\s*\.[^\d]/.test(k) && (i.innerHTML = k.replace(/^\s*1\s*\./, ""), g.setStartAtLast(i).collapse(!0).select(), h.__hasEnterExecCommand = !0, h.execCommand("insertorderedlist"), h.__hasEnterExecCommand = !1)
              }
              var l = h.selection.getRange(),
                m = d(l.startContainer,
                  function(a) {
                    return "TABLE" == a.tagName
                  }),
                n = l.collapsed ? m: d(l.endContainer,
                  function(a) {
                    return "TABLE" == a.tagName
                  });
              if (m && n && m === n) {
                if (!l.collapsed) {
                  if (m = domUtils.findParentByTagName(l.startContainer, "li", !0), n = domUtils.findParentByTagName(l.endContainer, "li", !0), !m || !n || m !== n) {
                    var o = l.cloneRange(),
                      p = o.collapse(!1).createBookmark();
                    l.deleteContents(),
                      o.moveToBookmark(p);
                    var j = domUtils.findParentByTagName(o.startContainer, "li", !0);
                    return f(j),
                      o.select(),
                      void c()
                  }
                  if (l.deleteContents(), j = domUtils.findParentByTagName(l.startContainer, "li", !0), j && domUtils.isEmptyBlock(j)) return v = j.previousSibling,
                    next = j.nextSibling,
                    s = h.document.createElement("p"),
                    domUtils.fillNode(h.document, s),
                    q = j.parentNode,
                    v && next ? (l.setStart(next, 0).collapse(!0).select(!0), domUtils.remove(j)) : ((v || next) && v ? j.parentNode.parentNode.insertBefore(s, q.nextSibling) : q.parentNode.insertBefore(s, q), domUtils.remove(j), q.firstChild || domUtils.remove(q), l.setStart(s, 0).setCursor()),
                    void c()
                }
                if (j = domUtils.findParentByTagName(l.startContainer, "li", !0)) {
                  if (domUtils.isEmptyBlock(j)) {
                    p = l.createBookmark();
                    var q = j.parentNode;
                    if (j !== q.lastChild ? (domUtils.breakParent(j, q), f(j)) : (q.parentNode.insertBefore(j, q.nextSibling), domUtils.isEmptyNode(q) && domUtils.remove(q)), !dtd.$list[j.parentNode.tagName]) if (domUtils.isBlockElm(j.firstChild)) domUtils.remove(j, !0);
                    else {
                      for (s = h.document.createElement("p"), j.parentNode.insertBefore(s, j); j.firstChild;) s.appendChild(j.firstChild);
                      domUtils.remove(j)
                    }
                    l.moveToBookmark(p).select()
                  } else {
                    var r = j.firstChild;
                    if (!r || !domUtils.isBlockElm(r)) {
                      var s = h.document.createElement("p");
                      for (!j.firstChild && domUtils.fillNode(h.document, s); j.firstChild;) s.appendChild(j.firstChild);
                      j.appendChild(s),
                        r = s
                    }
                    var t = h.document.createElement("span");
                    l.insertNode(t),
                      domUtils.breakParent(t, j);
                    var u = t.nextSibling;
                    r = u.firstChild,
                    r || (s = h.document.createElement("p"), domUtils.fillNode(h.document, s), u.appendChild(s), r = s),
                    domUtils.isEmptyNode(r) && (r.innerHTML = "", domUtils.fillNode(h.document, r)),
                      l.setStart(r, 0).collapse(!0).shrinkBoundary().select(),
                      domUtils.remove(t);
                    var v = u.previousSibling;
                    v && domUtils.isEmptyBlock(v) && (v.innerHTML = "<p></p>", domUtils.fillNode(h.document, v.firstChild))
                  }
                  c()
                }
              }
            }
            if (8 == e && (l = h.selection.getRange(), l.collapsed && domUtils.isStartInblock(l) && (o = l.cloneRange().trimBoundary(), j = domUtils.findParentByTagName(l.startContainer, "li", !0), j && domUtils.isStartInblock(o)))) {
              if (m = domUtils.findParentByTagName(l.startContainer, "p", !0), m && m !== j.firstChild) {
                var q = domUtils.findParentByTagName(m, ["ol", "ul"]);
                return domUtils.breakParent(m, q),
                  f(m),
                  h.fireEvent("contentchange"),
                  l.setStart(m, 0).setCursor(!1, !0),
                  h.fireEvent("saveScene"),
                  void domUtils.preventDefault(b)
              }
              if (j && (v = j.previousSibling)) {
                if (46 == e && j.childNodes.length) return;
                if (dtd.$list[v.tagName] && (v = v.lastChild), h.undoManger && h.undoManger.save(), r = j.firstChild, domUtils.isBlockElm(r)) if (domUtils.isEmptyNode(r)) for (v.appendChild(r), l.setStart(r, 0).setCursor(!1, !0); j.firstChild;) v.appendChild(j.firstChild);
                else t = h.document.createElement("span"),
                    l.insertNode(t),
                  domUtils.isEmptyBlock(v) && (v.innerHTML = ""),
                    domUtils.moveChild(j, v),
                    l.setStartBefore(t).collapse(!0).select(!0),
                    domUtils.remove(t);
                else if (domUtils.isEmptyNode(j)) {
                  var s = h.document.createElement("p");
                  v.appendChild(s),
                    l.setStart(s, 0).setCursor()
                } else for (l.setEnd(v, v.childNodes.length).collapse().select(!0); j.firstChild;) v.appendChild(j.firstChild);
                return domUtils.remove(j),
                  h.fireEvent("contentchange"),
                  h.fireEvent("saveScene"),
                  void domUtils.preventDefault(b)
              }
              if (j && !j.previousSibling) {
                var q = j.parentNode,
                  p = l.createBookmark();
                if (domUtils.isTagNode(q.parentNode, "ol ul")) q.parentNode.insertBefore(j, q),
                domUtils.isEmptyNode(q) && domUtils.remove(q);
                else {
                  for (; j.firstChild;) q.parentNode.insertBefore(j.firstChild, q);
                  domUtils.remove(j),
                  domUtils.isEmptyNode(q) && domUtils.remove(q)
                }
                return l.moveToBookmark(p).setCursor(!1, !0),
                  h.fireEvent("contentchange"),
                  h.fireEvent("saveScene"),
                  void domUtils.preventDefault(b)
              }
            }
          }),
        h.addListener("keyup",
          function(a, c) {
            var e = c.keyCode || c.which;
            if (8 == e) {
              var f, g = h.selection.getRange(); (f = domUtils.findParentByTagName(g.startContainer, ["ol", "ul"], !0)) && d(f, f.tagName.toLowerCase(), b(f) || domUtils.getComputedStyle(f, "list-style-type"), !0)
            }
          }),
        h.addListener("tabkeydown",
          function() {
            function a(a) {
              if (h.options.maxListLevel != -1) {
                for (var b = a.parentNode,
                       c = 0;
                     /[ou]l/i.test(b.tagName);) c++,
                  b = b.parentNode;
                if (c >= h.options.maxListLevel) return ! 0
              }
            }
            var c = h.selection.getRange(),
              f = domUtils.findParentByTagName(c.startContainer, "li", !0);
            if (f) {
              var g;
              if (!c.collapsed) {
                h.fireEvent("saveScene"),
                  g = c.createBookmark();
                for (var i, j, l = 0,
                       m = domUtils.findParents(f); j = m[l++];) if (domUtils.isTagNode(j, "ol ul")) {
                  i = j;
                  break
                }
                var n = f;
                if (g.end) for (; n && !(domUtils.getPosition(n, g.end) & domUtils.POSITION_FOLLOWING);) if (a(n)) n = domUtils.getNextDomNode(n, !1, null,
                  function(a) {
                    return a !== i
                  });
                else {
                  var o = n.parentNode,
                    p = h.document.createElement(o.tagName),
                    q = utils.indexOf(k[p.tagName], b(o) || domUtils.getComputedStyle(o, "list-style-type")),
                    r = q + 1 == k[p.tagName].length ? 0 : q + 1,
                    s = k[p.tagName][r];
                  for (e(p, s), o.insertBefore(p, n); n && !(domUtils.getPosition(n, g.end) & domUtils.POSITION_FOLLOWING);) {
                    if (f = n.nextSibling, p.appendChild(n), !f || domUtils.isTagNode(f, "ol ul")) {
                      if (f) for (; (f = f.firstChild) && "LI" != f.tagName;);
                      else f = domUtils.getNextDomNode(n, !1, null,
                        function(a) {
                          return a !== i
                        });
                      break
                    }
                    n = f
                  }
                  d(p, p.tagName.toLowerCase(), s),
                    n = f
                }
                return h.fireEvent("contentchange"),
                  c.moveToBookmark(g).select(),
                  !0
              }
              if (a(f)) return ! 0;
              var o = f.parentNode,
                p = h.document.createElement(o.tagName),
                q = utils.indexOf(k[p.tagName], b(o) || domUtils.getComputedStyle(o, "list-style-type"));
              q = q + 1 == k[p.tagName].length ? 0 : q + 1;
              var s = k[p.tagName][q];
              if (e(p, s), domUtils.isStartInblock(c)) return h.fireEvent("saveScene"),
                g = c.createBookmark(),
                o.insertBefore(p, f),
                p.appendChild(f),
                d(p, p.tagName.toLowerCase(), s),
                h.fireEvent("contentchange"),
                c.moveToBookmark(g).select(!0),
                !0
            }
          }),
        h.commands.insertorderedlist = h.commands.insertunorderedlist = {
          execCommand: function(a, c) {
            c || (c = "insertorderedlist" == a.toLowerCase() ? "decimal": "disc");
            var f = this,
              h = this.selection.getRange(),
              j = function(a) {
                return 1 == a.nodeType ? "br" != a.tagName.toLowerCase() : !domUtils.isWhitespace(a)
              },
              k = "insertorderedlist" == a.toLowerCase() ? "ol": "ul",
              l = f.document.createDocumentFragment();
            h.adjustmentBoundary().shrinkBoundary();
            var m, n, o, p, q = h.createBookmark(!0),
              r = g(f.document.getElementById(q.start)),
              s = 0,
              t = g(f.document.getElementById(q.end)),
              u = 0;
            if (r || t) {
              if (r && (m = r.parentNode), q.end || (t = r), t && (n = t.parentNode), m === n) {
                for (; r !== t;) {
                  if (p = r, r = r.nextSibling, !domUtils.isBlockElm(p.firstChild)) {
                    for (var v = f.document.createElement("p"); p.firstChild;) v.appendChild(p.firstChild);
                    p.appendChild(v)
                  }
                  l.appendChild(p)
                }
                if (p = f.document.createElement("span"), m.insertBefore(p, t), !domUtils.isBlockElm(t.firstChild)) {
                  for (v = f.document.createElement("p"); t.firstChild;) v.appendChild(t.firstChild);
                  t.appendChild(v)
                }
                l.appendChild(t),
                  domUtils.breakParent(p, m),
                domUtils.isEmptyNode(p.previousSibling) && domUtils.remove(p.previousSibling),
                domUtils.isEmptyNode(p.nextSibling) && domUtils.remove(p.nextSibling);
                var w = b(m) || domUtils.getComputedStyle(m, "list-style-type") || ("insertorderedlist" == a.toLowerCase() ? "decimal": "disc");
                if (m.tagName.toLowerCase() == k && w == c) {
                  for (var x, y = 0,
                         z = f.document.createDocumentFragment(); x = l.firstChild;) if (domUtils.isTagNode(x, "ol ul")) z.appendChild(x);
                  else for (; x.firstChild;) z.appendChild(x.firstChild),
                      domUtils.remove(x);
                  p.parentNode.insertBefore(z, p)
                } else o = f.document.createElement(k),
                  e(o, c),
                  o.appendChild(l),
                  p.parentNode.insertBefore(o, p);
                return domUtils.remove(p),
                o && d(o, k, c),
                  void h.moveToBookmark(q).select()
              }
              if (r) {
                for (; r;) {
                  if (p = r.nextSibling, domUtils.isTagNode(r, "ol ul")) l.appendChild(r);
                  else {
                    for (var A = f.document.createDocumentFragment(), B = 0; r.firstChild;) domUtils.isBlockElm(r.firstChild) && (B = 1),
                      A.appendChild(r.firstChild);
                    if (B) l.appendChild(A);
                    else {
                      var C = f.document.createElement("p");
                      C.appendChild(A),
                        l.appendChild(C)
                    }
                    domUtils.remove(r)
                  }
                  r = p
                }
                m.parentNode.insertBefore(l, m.nextSibling),
                  domUtils.isEmptyNode(m) ? (h.setStartBefore(m), domUtils.remove(m)) : h.setStartAfter(m),
                  s = 1
              }
              if (t && domUtils.inDoc(n, f.document)) {
                for (r = n.firstChild; r && r !== t;) {
                  if (p = r.nextSibling, domUtils.isTagNode(r, "ol ul")) l.appendChild(r);
                  else {
                    for (A = f.document.createDocumentFragment(), B = 0; r.firstChild;) domUtils.isBlockElm(r.firstChild) && (B = 1),
                      A.appendChild(r.firstChild);
                    B ? l.appendChild(A) : (C = f.document.createElement("p"), C.appendChild(A), l.appendChild(C)),
                      domUtils.remove(r)
                  }
                  r = p
                }
                var D = domUtils.createElement(f.document, "div", {
                  tmpDiv: 1
                });
                domUtils.moveChild(t, D),
                  l.appendChild(D),
                  domUtils.remove(t),
                  n.parentNode.insertBefore(l, n),
                  h.setEndBefore(n),
                domUtils.isEmptyNode(n) && domUtils.remove(n),
                  u = 1
              }
            }
            s || h.setStartBefore(f.document.getElementById(q.start)),
            q.end && !u && h.setEndAfter(f.document.getElementById(q.end)),
              h.enlarge(!0,
                function(a) {
                  return i[a.tagName]
                }),
              l = f.document.createDocumentFragment();
            for (var E, F = h.createBookmark(), G = domUtils.getNextDomNode(F.start, !1, j), H = h.cloneRange(), I = domUtils.isBlockElm; G && G !== F.end && domUtils.getPosition(G, F.end) & domUtils.POSITION_PRECEDING;) if (3 == G.nodeType || dtd.li[G.tagName]) {
              if (1 == G.nodeType && dtd.$list[G.tagName]) {
                for (; G.firstChild;) l.appendChild(G.firstChild);
                E = domUtils.getNextDomNode(G, !1, j),
                  domUtils.remove(G),
                  G = E;
                continue
              }
              for (E = G, H.setStartBefore(G); G && G !== F.end && (!I(G) || domUtils.isBookmarkNode(G));) E = G,
                G = domUtils.getNextDomNode(G, !1, null,
                  function(a) {
                    return ! i[a.tagName]
                  });
              G && I(G) && (p = domUtils.getNextDomNode(E, !1, j), p && domUtils.isBookmarkNode(p) && (G = domUtils.getNextDomNode(p, !1, j), E = p)),
                H.setEndAfter(E),
                G = domUtils.getNextDomNode(E, !1, j);
              var J = h.document.createElement("li");
              if (J.appendChild(H.extractContents()), domUtils.isEmptyNode(J)) {
                for (var E = h.document.createElement("p"); J.firstChild;) E.appendChild(J.firstChild);
                J.appendChild(E)
              }
              l.appendChild(J)
            } else G = domUtils.getNextDomNode(G, !0, j);
            h.moveToBookmark(F).collapse(!0),
              o = f.document.createElement(k),
              e(o, c),
              o.appendChild(l),
              h.insertNode(o),
              d(o, k, c);
            for (var x, y = 0,
                   K = domUtils.getElementsByTagName(o, "div"); x = K[y++];) x.getAttribute("tmpDiv") && domUtils.remove(x, !0);
            h.moveToBookmark(q).select()
          },
          queryCommandState: function(a) {
            for (var b, c = "insertorderedlist" == a.toLowerCase() ? "ol": "ul", d = this.selection.getStartElementPath(), e = 0; b = d[e++];) {
              if ("TABLE" == b.nodeName) return 0;
              if (c == b.nodeName.toLowerCase()) return 1
            }
            return 0
          },
          queryCommandValue: function(a) {
            for (var c, d, e = "insertorderedlist" == a.toLowerCase() ? "ol": "ul", f = this.selection.getStartElementPath(), g = 0; d = f[g++];) {
              if ("TABLE" == d.nodeName) {
                c = null;
                break
              }
              if (e == d.nodeName.toLowerCase()) {
                c = d;
                break
              }
            }
            return c ? b(c) || domUtils.getComputedStyle(c, "list-style-type") : null
          }
        }
    },
      function() {
        var a = {
          textarea: function(a, b) {
            var c = b.ownerDocument.createElement("textarea");
            return c.style.cssText = "position:absolute;resize:none;width:100%;height:100%;border:0;padding:0;margin:0;overflow-y:auto;",
            browser.ie && browser.version < 8 && (c.style.width = b.offsetWidth + "px", c.style.height = b.offsetHeight + "px", b.onresize = function() {
              c.style.width = b.offsetWidth + "px",
                c.style.height = b.offsetHeight + "px"
            }),
              b.appendChild(c),
              {
                setContent: function(a) {
                  c.value = a
                },
                getContent: function() {
                  return c.value
                },
                select: function() {
                  var a;
                  browser.ie ? (a = c.createTextRange(), a.collapse(!0), a.select()) : (c.setSelectionRange(0, 0), c.focus())
                },
                dispose: function() {
                  b.removeChild(c),
                    b.onresize = null,
                    c = null,
                    b = null
                }
              }
          },
          codemirror: function(a, b) {
            var c = window.CodeMirror(b, {
                mode: "text/html",
                tabMode: "indent",
                lineNumbers: !0,
                lineWrapping: !0
              }),
              d = c.getWrapperElement();
            return d.style.cssText = 'position:absolute;left:0;top:0;width:100%;height:100%;font-family:consolas,"Courier new",monospace;font-size:13px;',
              c.getScrollerElement().style.cssText = "position:absolute;left:0;top:0;width:100%;height:100%;",
              c.refresh(),
              {
                getCodeMirror: function() {
                  return c
                },
                setContent: function(a) {
                  c.setValue(a)
                },
                getContent: function() {
                  return c.getValue()
                },
                select: function() {
                  c.focus()
                },
                dispose: function() {
                  b.removeChild(d),
                    d = null,
                    c = null
                }
              }
          }
        };
        UE.plugins.source = function() {
          function b(b) {
            return a["codemirror" == f.sourceEditor && window.CodeMirror ? "codemirror": "textarea"](e, b)
          }
          var c, d, e = this,
            f = this.options,
            g = !1;
          f.sourceEditor = browser.ie ? "textarea": f.sourceEditor || "codemirror",
            e.setOpt({
              sourceEditorFirst: !1
            });
          var h, i, j;
          e.commands.source = {
            execCommand: function() {
              if (g = !g) {
                j = e.selection.getRange().createAddress(!1, !0),
                e.undoManger && e.undoManger.save(!0),
                browser.gecko && (e.body.contentEditable = !1),
                  h = e.iframe.style.cssText,
                  e.iframe.style.cssText += "position:absolute;left:-32768px;top:-32768px;",
                  e.fireEvent("beforegetcontent");
                var a = UE.htmlparser(e.body.innerHTML);
                e.filterOutputRule(a),
                  a.traversal(function(a) {
                    if ("element" == a.type) switch (a.tagName) {
                      case "td":
                      case "th":
                      case "caption":
                        a.children && 1 == a.children.length && "br" == a.firstChild().tagName && a.removeChild(a.firstChild());
                        break;
                      case "pre":
                        a.innerText(a.innerText().replace(/&nbsp;/g, " "))
                    }
                  }),
                  e.fireEvent("aftergetcontent");
                var f = a.toHtml(!0);
                c = b(e.iframe.parentNode),
                  c.setContent(f),
                  d = e.setContent,
                  e.setContent = function(a) {
                    var b = UE.htmlparser(a);
                    e.filterInputRule(b),
                      a = b.toHtml(),
                      c.setContent(a)
                  },
                  setTimeout(function() {
                    c.select(),
                      e.addListener("fullscreenchanged",
                        function() {
                          try {
                            c.getCodeMirror().refresh()
                          } catch(a) {}
                        })
                  }),
                  i = e.getContent,
                  e.getContent = function() {
                    return c.getContent() || "<p>" + (browser.ie ? "": "<br/>") + "</p>"
                  }
              } else {
                e.iframe.style.cssText = h;
                var k = c.getContent() || "<p>" + (browser.ie ? "": "<br/>") + "</p>";
                k = k.replace(new RegExp("[\\r\\t\\n ]*</?(\\w+)\\s*(?:[^>]*)>", "g"),
                  function(a, b) {
                    return b && !dtd.$inlineWithA[b.toLowerCase()] ? a.replace(/(^[\n\r\t ]*)|([\n\r\t ]*$)/g, "") : a.replace(/(^[\n\r\t]*)|([\n\r\t]*$)/g, "")
                  }),
                  e.setContent = d,
                  e.setContent(k),
                  c.dispose(),
                  c = null,
                  e.getContent = i;
                var l = e.body.firstChild;
                if (l || (e.body.innerHTML = "<p>" + (browser.ie ? "": "<br/>") + "</p>", l = e.body.firstChild), e.undoManger && e.undoManger.save(!0), browser.gecko) {
                  var m = document.createElement("input");
                  m.style.cssText = "position:absolute;left:0;top:-32768px",
                    document.body.appendChild(m),
                    e.body.contentEditable = !1,
                    setTimeout(function() {
                      domUtils.setViewportOffset(m, {
                        left: -32768,
                        top: 0
                      }),
                        m.focus(),
                        setTimeout(function() {
                          e.body.contentEditable = !0,
                            e.selection.getRange().moveToAddress(j).select(!0),
                            domUtils.remove(m)
                        })
                    })
                } else try {
                  e.selection.getRange().moveToAddress(j).select(!0)
                } catch(n) {}
              }
              this.fireEvent("sourcemodechanged", g)
            },
            queryCommandState: function() {
              return 0 | g
            },
            notNeedUndo: 1
          };
          var k = e.queryCommandState;
          e.queryCommandState = function(a) {
            return a = a.toLowerCase(),
              g ? a in {
                source: 1,
                fullscreen: 1
              } ? 1 : -1 : k.apply(this, arguments)
          },
          "codemirror" == f.sourceEditor && e.addListener("ready",
            function() {
              utils.loadFile(document, {
                  src: f.codeMirrorJsUrl || f.UEDITOR_HOME_URL + "third-party/codemirror/codemirror.js",
                  tag: "script",
                  type: "text/javascript",
                  defer: "defer"
                },
                function() {
                  f.sourceEditorFirst && setTimeout(function() {
                      e.execCommand("source")
                    },
                    0)
                }),
                utils.loadFile(document, {
                  tag: "link",
                  rel: "stylesheet",
                  type: "text/css",
                  href: f.codeMirrorCssUrl || f.UEDITOR_HOME_URL + "third-party/codemirror/codemirror.css"
                })
            })
        }
      } (),
      UE.plugins.enterkey = function() {
        var a, b = this,
          c = b.options.enterTag;
        b.addListener("keyup",
          function(c, d) {
            var e = d.keyCode || d.which;
            if (13 == e) {
              var f, g = b.selection.getRange(),
                h = g.startContainer;
              if (browser.ie) b.fireEvent("saveScene", !0, !0);
              else {
                if (/h\d/i.test(a)) {
                  if (browser.gecko) {
                    var i = domUtils.findParentByTagName(h, ["h1", "h2", "h3", "h4", "h5", "h6", "blockquote", "caption", "table"], !0);
                    i || (b.document.execCommand("formatBlock", !1, "<p>"), f = 1)
                  } else if (1 == h.nodeType) {
                    var j, k = b.document.createTextNode("");
                    if (g.insertNode(k), j = domUtils.findParentByTagName(k, "div", !0)) {
                      for (var l = b.document.createElement("p"); j.firstChild;) l.appendChild(j.firstChild);
                      j.parentNode.insertBefore(l, j),
                        domUtils.remove(j),
                        g.setStartBefore(k).setCursor(),
                        f = 1
                    }
                    domUtils.remove(k)
                  }
                  b.undoManger && f && b.undoManger.save()
                }
                browser.opera && g.select()
              }
            }
          }),
          b.addListener("keydown",
            function(d, e) {
              var f = e.keyCode || e.which;
              if (13 == f) {
                if (b.fireEvent("beforeenterkeydown")) return void domUtils.preventDefault(e);
                b.fireEvent("saveScene", !0, !0),
                  a = "";
                var g = b.selection.getRange();
                if (!g.collapsed) {
                  var h = g.startContainer,
                    i = g.endContainer,
                    j = domUtils.findParentByTagName(h, "td", !0),
                    k = domUtils.findParentByTagName(i, "td", !0);
                  if (j && k && j !== k || !j && k || j && !k) return void(e.preventDefault ? e.preventDefault() : e.returnValue = !1)
                }
                if ("p" == c) browser.ie || (h = domUtils.findParentByTagName(g.startContainer, ["ol", "ul", "p", "h1", "h2", "h3", "h4", "h5", "h6", "blockquote", "caption"], !0), h || browser.opera ? (a = h.tagName, "p" == h.tagName.toLowerCase() && browser.gecko && domUtils.removeDirtyAttr(h)) : (b.document.execCommand("formatBlock", !1, "<p>"), browser.gecko && (g = b.selection.getRange(), h = domUtils.findParentByTagName(g.startContainer, "p", !0), h && domUtils.removeDirtyAttr(h))));
                else if (e.preventDefault ? e.preventDefault() : e.returnValue = !1, g.collapsed) {
                  m = g.document.createElement("br"),
                    g.insertNode(m);
                  var l = m.parentNode;
                  l.lastChild === m ? (m.parentNode.insertBefore(m.cloneNode(!0), m), g.setStartBefore(m)) : g.setStartAfter(m),
                    g.setCursor()
                } else if (g.deleteContents(), h = g.startContainer, 1 == h.nodeType && (h = h.childNodes[g.startOffset])) {
                  for (; 1 == h.nodeType;) {
                    if (dtd.$empty[h.tagName]) return g.setStartBefore(h).setCursor(),
                    b.undoManger && b.undoManger.save(),
                      !1;
                    if (!h.firstChild) {
                      var m = g.document.createElement("br");
                      return h.appendChild(m),
                        g.setStart(h, 0).setCursor(),
                      b.undoManger && b.undoManger.save(),
                        !1
                    }
                    h = h.firstChild
                  }
                  h === g.startContainer.childNodes[g.startOffset] ? (m = g.document.createElement("br"), g.insertNode(m).setCursor()) : g.setStart(h, 0).setCursor()
                } else m = g.document.createElement("br"),
                  g.insertNode(m).setStartAfter(m).setCursor()
              }
            })
      },
      UE.plugins.keystrokes = function() {
        var a = this,
          b = !0;
        a.addListener("keydown",
          function(c, d) {
            var e = d.keyCode || d.which,
              f = a.selection.getRange();
            if (!f.collapsed && !(d.ctrlKey || d.shiftKey || d.altKey || d.metaKey) && (e >= 65 && e <= 90 || e >= 48 && e <= 57 || e >= 96 && e <= 111 || {
              13 : 1,
              8 : 1,
              46 : 1
            } [e])) {
              var g = f.startContainer;
              if (domUtils.isFillChar(g) && f.setStartBefore(g), g = f.endContainer, domUtils.isFillChar(g) && f.setEndAfter(g), f.txtToElmBoundary(), f.endContainer && 1 == f.endContainer.nodeType && (g = f.endContainer.childNodes[f.endOffset], g && domUtils.isBr(g) && f.setEndAfter(g)), 0 == f.startOffset && (g = f.startContainer, domUtils.isBoundaryNode(g, "firstChild") && (g = f.endContainer, f.endOffset == (3 == g.nodeType ? g.nodeValue.length: g.childNodes.length) && domUtils.isBoundaryNode(g, "lastChild")))) return a.fireEvent("saveScene"),
                a.body.innerHTML = "<p>" + (browser.ie ? "": "<br/>") + "</p>",
                f.setStart(a.body.firstChild, 0).setCursor(!1, !0),
                void a._selectionChange()
            }
            if (e == keymap.Backspace) {
              if (f = a.selection.getRange(), b = f.collapsed, a.fireEvent("delkeydown", d)) return;
              var h, i;
              if (f.collapsed && f.inFillChar() && (h = f.startContainer, domUtils.isFillChar(h) ? (f.setStartBefore(h).shrinkBoundary(!0).collapse(!0), domUtils.remove(h)) : (h.nodeValue = h.nodeValue.replace(new RegExp("^" + domUtils.fillChar), ""), f.startOffset--, f.collapse(!0).select(!0))), h = f.getClosedNode()) return a.fireEvent("saveScene"),
                f.setStartBefore(h),
                domUtils.remove(h),
                f.setCursor(),
                a.fireEvent("saveScene"),
                void domUtils.preventDefault(d);
              if (!browser.ie && (h = domUtils.findParentByTagName(f.startContainer, "table", !0), i = domUtils.findParentByTagName(f.endContainer, "table", !0), h && !i || !h && i || h !== i)) return void d.preventDefault()
            }
            if (e == keymap.Tab) {
              var j = {
                ol: 1,
                ul: 1,
                table: 1
              };
              if (a.fireEvent("tabkeydown", d)) return void domUtils.preventDefault(d);
              var k = a.selection.getRange();
              a.fireEvent("saveScene");
              for (var l = 0,
                     m = "",
                     n = a.options.tabSize || 4,
                     o = a.options.tabNode || "&nbsp;"; l < n; l++) m += o;
              var p = a.document.createElement("span");
              if (p.innerHTML = m + domUtils.fillChar, k.collapsed) k.insertNode(p.cloneNode(!0).firstChild).setCursor(!0);
              else {
                var q = function(a) {
                  return domUtils.isBlockElm(a) && !j[a.tagName.toLowerCase()]
                };
                if (h = domUtils.findParent(k.startContainer, q, !0), i = domUtils.findParent(k.endContainer, q, !0), h && i && h === i) k.deleteContents(),
                  k.insertNode(p.cloneNode(!0).firstChild).setCursor(!0);
                else {
                  var r = k.createBookmark();
                  k.enlarge(!0);
                  for (var s = k.createBookmark(), t = domUtils.getNextDomNode(s.start, !1, q); t && !(domUtils.getPosition(t, s.end) & domUtils.POSITION_FOLLOWING);) t.insertBefore(p.cloneNode(!0).firstChild, t.firstChild),
                    t = domUtils.getNextDomNode(t, !1, q);
                  k.moveToBookmark(s).moveToBookmark(r).select()
                }
              }
              domUtils.preventDefault(d)
            }
            if (browser.gecko && 46 == e && (k = a.selection.getRange(), k.collapsed && (h = k.startContainer, domUtils.isEmptyBlock(h)))) {
              for (var u = h.parentNode; 1 == domUtils.getChildCount(u) && !domUtils.isBody(u);) h = u,
                u = u.parentNode;
              return void(h === u.lastChild && d.preventDefault())
            }
          }),
          a.addListener("keyup",
            function(a, c) {
              var d, e = c.keyCode || c.which,
                f = this;
              if (e == keymap.Backspace) {
                if (f.fireEvent("delkeyup")) return;
                if (d = f.selection.getRange(), d.collapsed) {
                  var g, h = ["h1", "h2", "h3", "h4", "h5", "h6"];
                  if ((g = domUtils.findParentByTagName(d.startContainer, h, !0)) && domUtils.isEmptyBlock(g)) {
                    var i = g.previousSibling;
                    if (i && "TABLE" != i.nodeName) return domUtils.remove(g),
                      void d.setStartAtLast(i).setCursor(!1, !0);
                    var j = g.nextSibling;
                    if (j && "TABLE" != j.nodeName) return domUtils.remove(g),
                      void d.setStartAtFirst(j).setCursor(!1, !0)
                  }
                  if (domUtils.isBody(d.startContainer)) {
                    var g = domUtils.createElement(f.document, "p", {
                      innerHTML: browser.ie ? domUtils.fillChar: "<br/>"
                    });
                    d.insertNode(g).setStart(g, 0).setCursor(!1, !0)
                  }
                }
                if (!b && (3 == d.startContainer.nodeType || 1 == d.startContainer.nodeType && domUtils.isEmptyBlock(d.startContainer))) if (browser.ie) {
                  var k = d.document.createElement("span");
                  d.insertNode(k).setStartBefore(k).collapse(!0),
                    d.select(),
                    domUtils.remove(k)
                } else d.select()
              }
            })
      },
      UE.plugins.fiximgclick = function() {
        function a() {
          this.editor = null,
            this.resizer = null,
            this.cover = null,
            this.doc = document,
            this.prePos = {
              x: 0,
              y: 0
            },
            this.startPos = {
              x: 0,
              y: 0
            }
        }
        var b = !1;
        return function() {
          var c = [[0, 0, -1, -1], [0, 0, 0, -1], [0, 0, 1, -1], [0, 0, -1, 0], [0, 0, 1, 0], [0, 0, -1, 1], [0, 0, 0, 1], [0, 0, 1, 1]];
          a.prototype = {
            init: function(a) {
              var b = this;
              b.editor = a,
                b.startPos = this.prePos = {
                  x: 0,
                  y: 0
                },
                b.dragId = -1;
              var c = [],
                d = b.cover = document.createElement("div"),
                e = b.resizer = document.createElement("div");
              for (d.id = b.editor.ui.id + "_imagescale_cover", d.style.cssText = "position:absolute;display:none;z-index:" + b.editor.options.zIndex + ";filter:alpha(opacity=0); opacity:0;background:#CCC;", domUtils.on(d, "mousedown click",
                function() {
                  b.hide()
                }), i = 0; i < 8; i++) c.push('<span class="edui-editor-imagescale-hand' + i + '"></span>');
              e.id = b.editor.ui.id + "_imagescale",
                e.className = "edui-editor-imagescale",
                e.innerHTML = c.join(""),
                e.style.cssText += ";display:none;border:1px solid #3b77ff;z-index:" + b.editor.options.zIndex + ";",
                b.editor.ui.getDom().appendChild(d),
                b.editor.ui.getDom().appendChild(e),
                b.initStyle(),
                b.initEvents()
            },
            initStyle: function() {
              utils.cssRule("imagescale", ".edui-editor-imagescale{display:none;position:absolute;border:1px solid #38B2CE;cursor:hand;-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box;}.edui-editor-imagescale span{position:absolute;width:6px;height:6px;overflow:hidden;font-size:0px;display:block;background-color:#3C9DD0;}.edui-editor-imagescale .edui-editor-imagescale-hand0{cursor:nw-resize;top:0;margin-top:-4px;left:0;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand1{cursor:n-resize;top:0;margin-top:-4px;left:50%;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand2{cursor:ne-resize;top:0;margin-top:-4px;left:100%;margin-left:-3px;}.edui-editor-imagescale .edui-editor-imagescale-hand3{cursor:w-resize;top:50%;margin-top:-4px;left:0;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand4{cursor:e-resize;top:50%;margin-top:-4px;left:100%;margin-left:-3px;}.edui-editor-imagescale .edui-editor-imagescale-hand5{cursor:sw-resize;top:100%;margin-top:-3px;left:0;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand6{cursor:s-resize;top:100%;margin-top:-3px;left:50%;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand7{cursor:se-resize;top:100%;margin-top:-3px;left:100%;margin-left:-3px;}")
            },
            initEvents: function() {
              var a = this;
              a.startPos.x = a.startPos.y = 0,
                a.isDraging = !1
            },
            _eventHandler: function(a) {
              var c = this;
              switch (a.type) {
                case "mousedown":
                  var d, d = a.target || a.srcElement;
                  d.className.indexOf("edui-editor-imagescale-hand") != -1 && c.dragId == -1 && (c.dragId = d.className.slice( - 1), c.startPos.x = c.prePos.x = a.clientX, c.startPos.y = c.prePos.y = a.clientY, domUtils.on(c.doc, "mousemove", c.proxy(c._eventHandler, c)));
                  break;
                case "mousemove":
                  c.dragId != -1 && (c.updateContainerStyle(c.dragId, {
                    x: a.clientX - c.prePos.x,
                    y: a.clientY - c.prePos.y
                  }), c.prePos.x = a.clientX, c.prePos.y = a.clientY, b = !0, c.updateTargetElement());
                  break;
                case "mouseup":
                  c.dragId != -1 && (c.updateContainerStyle(c.dragId, {
                    x: a.clientX - c.prePos.x,
                    y: a.clientY - c.prePos.y
                  }), c.updateTargetElement(), c.target.parentNode && c.attachTo(c.target), c.dragId = -1),
                    domUtils.un(c.doc, "mousemove", c.proxy(c._eventHandler, c)),
                  b && (b = !1, c.editor.fireEvent("contentchange"))
              }
            },
            updateTargetElement: function() {
              var a = this;
              domUtils.setStyles(a.target, {
                width: a.resizer.style.width,
                height: a.resizer.style.height
              }),
                a.target.width = parseInt(a.resizer.style.width),
                a.target.height = parseInt(a.resizer.style.height),
                a.attachTo(a.target)
            },
            updateContainerStyle: function(a, b) {
              var d, e = this,
                f = e.resizer;
              0 != c[a][0] && (d = parseInt(f.style.left) + b.x, f.style.left = e._validScaledProp("left", d) + "px"),
              0 != c[a][1] && (d = parseInt(f.style.top) + b.y, f.style.top = e._validScaledProp("top", d) + "px"),
              0 != c[a][2] && (d = f.clientWidth + c[a][2] * b.x, f.style.width = e._validScaledProp("width", d) + "px"),
              0 != c[a][3] && (d = f.clientHeight + c[a][3] * b.y, f.style.height = e._validScaledProp("height", d) + "px")
            },
            _validScaledProp: function(a, b) {
              var c = this.resizer,
                d = document;
              switch (b = isNaN(b) ? 0 : b, a) {
                case "left":
                  return b < 0 ? 0 : b + c.clientWidth > d.clientWidth ? d.clientWidth - c.clientWidth: b;
                case "top":
                  return b < 0 ? 0 : b + c.clientHeight > d.clientHeight ? d.clientHeight - c.clientHeight: b;
                case "width":
                  return b <= 0 ? 1 : b + c.offsetLeft > d.clientWidth ? d.clientWidth - c.offsetLeft: b;
                case "height":
                  return b <= 0 ? 1 : b + c.offsetTop > d.clientHeight ? d.clientHeight - c.offsetTop: b
              }
            },
            hideCover: function() {
              this.cover.style.display = "none"
            },
            showCover: function() {
              var a = this,
                b = domUtils.getXY(a.editor.ui.getDom()),
                c = domUtils.getXY(a.editor.iframe);
              domUtils.setStyles(a.cover, {
                width: a.editor.iframe.offsetWidth + "px",
                height: a.editor.iframe.offsetHeight + "px",
                top: c.y - b.y + "px",
                left: c.x - b.x + "px",
                position: "absolute",
                display: ""
              })
            },
            show: function(a) {
              var b = this;
              b.resizer.style.display = "block",
              a && b.attachTo(a),
                domUtils.on(this.resizer, "mousedown", b.proxy(b._eventHandler, b)),
                domUtils.on(b.doc, "mouseup", b.proxy(b._eventHandler, b)),
                b.showCover(),
                b.editor.fireEvent("afterscaleshow", b),
                b.editor.fireEvent("saveScene")
            },
            hide: function() {
              var a = this;
              a.hideCover(),
                a.resizer.style.display = "none",
                domUtils.un(a.resizer, "mousedown", a.proxy(a._eventHandler, a)),
                domUtils.un(a.doc, "mouseup", a.proxy(a._eventHandler, a)),
                a.editor.fireEvent("afterscalehide", a)
            },
            proxy: function(a, b) {
              return function(c) {
                return a.apply(b || this, arguments)
              }
            },
            attachTo: function(a) {
              var b = this,
                c = b.target = a,
                d = this.resizer,
                e = domUtils.getXY(c),
                f = domUtils.getXY(b.editor.iframe),
                g = domUtils.getXY(d.parentNode);
              domUtils.setStyles(d, {
                width: c.width + "px",
                height: c.height + "px",
                left: f.x + e.x - b.editor.document.body.scrollLeft - g.x - parseInt(d.style.borderLeftWidth) + "px",
                top: f.y + e.y - b.editor.document.body.scrollTop - g.y - parseInt(d.style.borderTopWidth) + "px"
              })
            }
          }
        } (),
          function() {
            var b, c = this;
            c.setOpt("imageScaleEnabled", !0),
            !browser.ie && c.options.imageScaleEnabled && c.addListener("click",
              function(d, e) {
                var f = c.selection.getRange(),
                  g = f.getClosedNode();
                if (g && "IMG" == g.tagName && "false" != c.body.contentEditable) {
                  if (g.className.indexOf("edui-faked-music") != -1 || g.getAttribute("anchorname") || domUtils.hasClass(g, "loadingclass") || domUtils.hasClass(g, "loaderrorclass")) return;
                  if (!b) {
                    b = new a,
                      b.init(c),
                      c.ui.getDom().appendChild(b.resizer);
                    var h, i = function(a) {
                        b.hide(),
                        b.target && c.selection.getRange().selectNode(b.target).select()
                      },
                      j = function(a) {
                        var b = a.target || a.srcElement; ! b || void 0 !== b.className && b.className.indexOf("edui-editor-imagescale") != -1 || i(a)
                      };
                    c.addListener("afterscaleshow",
                      function(a) {
                        c.addListener("beforekeydown", i),
                          c.addListener("beforemousedown", j),
                          domUtils.on(document, "keydown", i),
                          domUtils.on(document, "mousedown", j),
                          c.selection.getNative().removeAllRanges()
                      }),
                      c.addListener("afterscalehide",
                        function(a) {
                          c.removeListener("beforekeydown", i),
                            c.removeListener("beforemousedown", j),
                            domUtils.un(document, "keydown", i),
                            domUtils.un(document, "mousedown", j);
                          var d = b.target;
                          d.parentNode && c.selection.getRange().selectNode(d).select()
                        }),
                      domUtils.on(b.resizer, "mousedown",
                        function(a) {
                          c.selection.getNative().removeAllRanges();
                          var d = a.target || a.srcElement;
                          d && d.className.indexOf("edui-editor-imagescale-hand") == -1 && (h = setTimeout(function() {
                              b.hide(),
                              b.target && c.selection.getRange().selectNode(d).select()
                            },
                            200))
                        }),
                      domUtils.on(b.resizer, "mouseup",
                        function(a) {
                          var b = a.target || a.srcElement;
                          b && b.className.indexOf("edui-editor-imagescale-hand") == -1 && clearTimeout(h)
                        })
                  }
                  b.show(g)
                } else b && "none" != b.resizer.style.display && b.hide()
              }),
            browser.webkit && c.addListener("click",
              function(a, b) {
                if ("IMG" == b.target.tagName && "false" != c.body.contentEditable) {
                  var d = new dom.Range(c.document);
                  d.selectNode(b.target).select()
                }
              })
          }
      } (),
      UE.plugin.register("autolink",
        function() {
          var a = 0;
          return browser.ie ? {}: {
            bindEvents: {
              reset: function() {
                a = 0
              },
              keydown: function(a, b) {
                var c = this,
                  d = b.keyCode || b.which;
                if (32 == d || 13 == d) {
                  for (var e, f, g = c.selection.getNative(), h = g.getRangeAt(0).cloneRange(), i = h.startContainer; 1 == i.nodeType && h.startOffset > 0 && (i = h.startContainer.childNodes[h.startOffset - 1]);) h.setStart(i, 1 == i.nodeType ? i.childNodes.length: i.nodeValue.length),
                    h.collapse(!0),
                    i = h.startContainer;
                  do {
                    if (0 == h.startOffset) {
                      for (i = h.startContainer.previousSibling; i && 1 == i.nodeType;) i = i.lastChild;
                      if (!i || domUtils.isFillChar(i)) break;
                      e = i.nodeValue.length
                    } else i = h.startContainer, e = h.startOffset;
                    h.setStart(i, e - 1), f = h.toString().charCodeAt(0)
                  } while ( 160 != f && 32 != f );
                  if (h.toString().replace(new RegExp(domUtils.fillChar, "g"), "").match(/(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i)) {
                    for (; h.toString().length && !/^(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i.test(h.toString());) try {
                      h.setStart(h.startContainer, h.startOffset + 1)
                    } catch(j) {
                      for (var i = h.startContainer; ! (next = i.nextSibling);) {
                        if (domUtils.isBody(i)) return;
                        i = i.parentNode
                      }
                      h.setStart(next, 0)
                    }
                    if (domUtils.findParentByTagName(h.startContainer, "a", !0)) return;
                    var k, l = c.document.createElement("a"),
                      m = c.document.createTextNode(" ");
                    c.undoManger && c.undoManger.save(),
                      l.appendChild(h.extractContents()),
                      l.href = l.innerHTML = l.innerHTML.replace(/<[^>]+>/g, ""),
                      k = l.getAttribute("href").replace(new RegExp(domUtils.fillChar, "g"), ""),
                      k = /^(?:https?:\/\/)/gi.test(k) ? k: "http://" + k,
                      l.setAttribute("_src", utils.html(k)),
                      l.href = utils.html(k),
                      h.insertNode(l),
                      l.parentNode.insertBefore(m, l.nextSibling),
                      h.setStart(m, 0),
                      h.collapse(!0),
                      g.removeAllRanges(),
                      g.addRange(h),
                    c.undoManger && c.undoManger.save()
                  }
                }
              }
            }
          }
        },
        function() {
          function a(a) {
            if (3 == a.nodeType) return null;
            if ("A" == a.nodeName) return a;
            for (var b = a.lastChild; b;) {
              if ("A" == b.nodeName) return b;
              if (3 == b.nodeType) {
                if (domUtils.isWhitespace(b)) {
                  b = b.previousSibling;
                  continue
                }
                return null
              }
              b = b.lastChild
            }
          }
          var b = {
            37 : 1,
            38 : 1,
            39 : 1,
            40 : 1,
            13 : 1,
            32 : 1
          };
          browser.ie && this.addListener("keyup",
            function(c, d) {
              var e = this,
                f = d.keyCode;
              if (b[f]) {
                var g = e.selection.getRange(),
                  h = g.startContainer;
                if (13 == f) {
                  for (; h && !domUtils.isBody(h) && !domUtils.isBlockElm(h);) h = h.parentNode;
                  if (h && !domUtils.isBody(h) && "P" == h.nodeName) {
                    var i = h.previousSibling;
                    if (i && 1 == i.nodeType) {
                      var i = a(i);
                      i && !i.getAttribute("_href") && domUtils.remove(i, !0)
                    }
                  }
                } else if (32 == f) 3 == h.nodeType && /^\s$/.test(h.nodeValue) && (h = h.previousSibling, h && "A" == h.nodeName && !h.getAttribute("_href") && domUtils.remove(h, !0));
                else if (h = domUtils.findParentByTagName(h, "a", !0), h && !h.getAttribute("_href")) {
                  var j = g.createBookmark();
                  domUtils.remove(h, !0),
                    g.moveToBookmark(j).select(!0)
                }
              }
            })
        }),
      UE.plugins.autoheight = function() {
        function a() {
          var a = this;
          clearTimeout(e),
          f || (!a.queryCommandState || a.queryCommandState && 1 != a.queryCommandState("source")) && (e = setTimeout(function() {
              for (var b = a.body.lastChild; b && 1 != b.nodeType;) b = b.previousSibling;
              b && 1 == b.nodeType && (b.style.clear = "both", d = Math.max(domUtils.getXY(b).y + b.offsetHeight + 25, Math.max(h.minFrameHeight, h.initialFrameHeight)), d != g && (d !== parseInt(a.iframe.parentNode.style.height) && (a.iframe.parentNode.style.height = d + "px"), a.body.style.height = d + "px", g = d), domUtils.removeStyle(b, "clear"))
            },
            50))
        }
        var b = this;
        if (b.autoHeightEnabled = b.options.autoHeightEnabled !== !1, b.autoHeightEnabled) {
          var c, d, e, f, g = 0,
            h = b.options;
          b.addListener("fullscreenchanged",
            function(a, b) {
              f = b
            }),
            b.addListener("destroy",
              function() {
                b.removeListener("contentchange afterinserthtml keyup mouseup", a)
              }),
            b.enableAutoHeight = function() {
              var b = this;
              if (b.autoHeightEnabled) {
                var d = b.document;
                b.autoHeightEnabled = !0,
                  c = d.body.style.overflowY,
                  d.body.style.overflowY = "hidden",
                  b.addListener("contentchange afterinserthtml keyup mouseup", a),
                  setTimeout(function() {
                      a.call(b)
                    },
                    browser.gecko ? 100 : 0),
                  b.fireEvent("autoheightchanged", b.autoHeightEnabled)
              }
            },
            b.disableAutoHeight = function() {
              b.body.style.overflowY = c || "",
                b.removeListener("contentchange", a),
                b.removeListener("keyup", a),
                b.removeListener("mouseup", a),
                b.autoHeightEnabled = !1,
                b.fireEvent("autoheightchanged", b.autoHeightEnabled)
            },
            b.on("setHeight",
              function() {
                b.disableAutoHeight()
              }),
            b.addListener("ready",
              function() {
                b.enableAutoHeight();
                var c;
                domUtils.on(browser.ie ? b.body: b.document, browser.webkit ? "dragover": "drop",
                  function() {
                    clearTimeout(c),
                      c = setTimeout(function() {
                          a.call(b)
                        },
                        100)
                  });
                var d;
                window.onscroll = function() {
                  null === d ? d = this.scrollY: 0 == this.scrollY && 0 != d && (b.window.scrollTo(0, 0), d = null)
                }
              })
        }
      },
      UE.plugins.autofloat = function() {
        function a() {
          return UE.ui ? 1 : (alert(g.autofloatMsg), 0)
        }
        function b() {
          var a = document.body.style;
          a.backgroundImage = 'url("about:blank")',
            a.backgroundAttachment = "fixed"
        }
        function c() {
          var a = domUtils.getXY(k),
            b = domUtils.getComputedStyle(k, "position"),
            c = domUtils.getComputedStyle(k, "left");
          k.style.width = k.offsetWidth + "px",
            k.style.zIndex = 1 * f.options.zIndex + 1,
            k.parentNode.insertBefore(q, k),
            o || p && browser.ie ? ("absolute" != k.style.position && (k.style.position = "absolute"), k.style.top = (document.body.scrollTop || document.documentElement.scrollTop) - l + i + "px") : (browser.ie7Compat && r && (r = !1, k.style.left = domUtils.getXY(k).x - document.documentElement.getBoundingClientRect().left + 2 + "px"), "fixed" != k.style.position && (k.style.position = "fixed", k.style.top = i + "px", ("absolute" == b || "relative" == b) && parseFloat(c) && (k.style.left = a.x + "px")))
        }
        function d() {
          r = !0,
          q.parentNode && q.parentNode.removeChild(q),
            k.style.cssText = j
        }
        function e() {
          var a = m(f.container),
            b = f.options.toolbarTopOffset || 0;
          a.top < 0 && a.bottom - k.offsetHeight > b ? c() : d()
        }
        var f = this,
          g = f.getLang();
        f.setOpt({
          topOffset: 0
        });
        var h = f.options.autoFloatEnabled !== !1,
          i = f.options.topOffset;
        if (h) {
          var j, k, l, m, n = UE.ui.uiUtils,
            o = browser.ie && browser.version <= 6,
            p = browser.quirks,
            q = document.createElement("div"),
            r = !0,
            s = utils.defer(function() {
                e()
              },
              browser.ie ? 200 : 100, !0);
          f.addListener("destroy",
            function() {
              domUtils.un(window, ["scroll", "resize"], e),
                f.removeListener("keydown", s)
            }),
            f.addListener("ready",
              function() {
                if (a(f)) {
                  if (!f.ui) return;
                  m = n.getClientRect,
                    k = f.ui.getDom("toolbarbox"),
                    l = m(k).top,
                    j = k.style.cssText,
                    q.style.height = k.offsetHeight + "px",
                  o && b(),
                    domUtils.on(window, ["scroll", "resize"], e),
                    f.addListener("keydown", s),
                    f.addListener("beforefullscreenchange",
                      function(a, b) {
                        b && d()
                      }),
                    f.addListener("fullscreenchanged",
                      function(a, b) {
                        b || e()
                      }),
                    f.addListener("sourcemodechanged",
                      function(a, b) {
                        setTimeout(function() {
                            e()
                          },
                          0)
                      }),
                    f.addListener("clearDoc",
                      function() {
                        setTimeout(function() {
                            e()
                          },
                          0)
                      })
                }
              })
        }
      },
      UE.plugins.video = function() {
        function a(a, b, d, e, f, g, h) {
          a = utils.unhtmlForUrl(a),
            f = utils.unhtml(f),
            g = utils.unhtml(g),
            b = parseInt(b, 10) || 0,
            d = parseInt(d, 10) || 0;
          var i;
          switch (h) {
            case "image":
              i = "<img " + (e ? 'id="' + e + '"': "") + ' width="' + b + '" height="' + d + '" _url="' + a + '" class="' + g.replace(/\bvideo-js\b/, "") + '" src="' + c.options.UEDITOR_HOME_URL + 'themes/default/images/spacer.gif" style="background:url(' + c.options.UEDITOR_HOME_URL + "themes/default/images/videologo.gif) no-repeat center center; border:1px solid gray;" + (f ? "float:" + f + ";": "") + '" />';
              break;
            case "embed":
              i = '<embed type="application/x-shockwave-flash" class="' + g + '" pluginspage="http://www.macromedia.com/go/getflashplayer" src="' + utils.html(a) + '" width="' + b + '" height="' + d + '"' + (f ? ' style="float:' + f + '"': "") + ' wmode="transparent" play="true" loop="false" menu="false" allowscriptaccess="never" allowfullscreen="true" >';
              break;
            case "video":
              var j = a.substr(a.lastIndexOf(".") + 1);
              "ogv" == j && (j = "ogg"),
                i = "<video" + (e ? ' id="' + e + '"': "") + ' class="' + g + ' video-js" ' + (f ? ' style="float:' + f + '"': "") + ' controls preload="none" width="' + b + '" height="' + d + '" src="' + a + '" data-setup="{}"><source src="' + a + '" type="video/' + j + '" /></video>'
          }
          return i
        }
        function b(b, c) {
          utils.each(b.getNodesByTagName(c ? "img": "embed video"),
            function(b) {
              var d = b.getAttr("class");
              if (d && d.indexOf("edui-faked-video") != -1) {
                var e = a(c ? b.getAttr("_url") : b.getAttr("src"), b.getAttr("width"), b.getAttr("height"), null, b.getStyle("float") || "", d, c ? "embed": "image");
                b.parentNode.replaceChild(UE.uNode.createElement(e), b)
              }
              if (d && d.indexOf("edui-upload-video") != -1) {
                var e = a(c ? b.getAttr("_url") : b.getAttr("src"), b.getAttr("width"), b.getAttr("height"), null, b.getStyle("float") || "", d, c ? "video": "image");
                b.parentNode.replaceChild(UE.uNode.createElement(e), b)
              }
            })
        }
        var c = this;
        c.addOutputRule(function(a) {
          b(a, !0)
        }),
          c.addInputRule(function(a) {
            b(a)
          }),
          c.commands.insertvideo = {
            execCommand: function(b, d, e) {
              d = utils.isArray(d) ? d: [d];
              for (var f, g, h = [], i = "tmpVedio", j = 0, k = d.length; j < k; j++) g = d[j],
                f = "upload" == e ? "edui-upload-video video-js vjs-default-skin": "edui-faked-video",
                h.push(a(g.url, g.width || 420, g.height || 280, i + j, null, f, "image"));
              c.execCommand("inserthtml", h.join(""), !0);
              for (var l = this.selection.getRange(), j = 0, k = d.length; j < k; j++) {
                var m = this.document.getElementById("tmpVedio" + j);
                domUtils.removeAttributes(m, "id"),
                  l.selectNode(m).select(),
                  c.execCommand("imagefloat", d[j].align)
              }
            },
            queryCommandState: function() {
              var a = c.selection.getRange().getClosedNode(),
                b = a && ("edui-faked-video" == a.className || a.className.indexOf("edui-upload-video") != -1);
              return b ? 1 : 0
            }
          }
      },
      function() {
        function a(a) {}
        var b = UE.UETable = function(a) {
          this.table = a,
            this.indexTable = [],
            this.selectedTds = [],
            this.cellsRange = {},
            this.update(a)
        };
        b.removeSelectedClass = function(a) {
          utils.each(a,
            function(a) {
              domUtils.removeClasses(a, "selectTdClass")
            })
        },
          b.addSelectedClass = function(a) {
            utils.each(a,
              function(a) {
                domUtils.addClass(a, "selectTdClass")
              })
          },
          b.isEmptyBlock = function(a) {
            var b = new RegExp(domUtils.fillChar, "g");
            if (a[browser.ie ? "innerText": "textContent"].replace(/^\s*$/, "").replace(b, "").length > 0) return 0;
            for (var c in dtd.$isNotEmpty) if (dtd.$isNotEmpty.hasOwnProperty(c) && a.getElementsByTagName(c).length) return 0;
            return 1
          },
          b.getWidth = function(a) {
            return a ? parseInt(domUtils.getComputedStyle(a, "width"), 10) : 0
          },
          b.getTableCellAlignState = function(a) { ! utils.isArray(a) && (a = [a]);
            var b = {},
              c = ["align", "valign"],
              d = null,
              e = !0;
            return utils.each(a,
              function(a) {
                return utils.each(c,
                  function(c) {
                    if (d = a.getAttribute(c), !b[c] && d) b[c] = d;
                    else if (!b[c] || d !== b[c]) return e = !1,
                      !1
                  }),
                  e
              }),
              e ? b: null
          },
          b.getTableItemsByRange = function(a) {
            var b = a.selection.getStart();
            b && b.id && 0 === b.id.indexOf("_baidu_bookmark_start_") && b.nextSibling && (b = b.nextSibling);
            var c = b && domUtils.findParentByTagName(b, ["td", "th"], !0),
              d = c && c.parentNode,
              e = b && domUtils.findParentByTagName(b, "caption", !0),
              f = e ? e.parentNode: d && d.parentNode.parentNode;
            return {
              cell: c,
              tr: d,
              table: f,
              caption: e
            }
          },
          b.getUETableBySelected = function(a) {
            var c = b.getTableItemsByRange(a).table;
            return c && c.ueTable && c.ueTable.selectedTds.length ? c.ueTable: null
          },
          b.getDefaultValue = function(a, b) {
            var c, d, e, f, g = {
              thin: "0px",
              medium: "1px",
              thick: "2px"
            };
            if (b) return h = b.getElementsByTagName("td")[0],
              f = domUtils.getComputedStyle(b, "border-left-width"),
              c = parseInt(g[f] || f, 10),
              f = domUtils.getComputedStyle(h, "padding-left"),
              d = parseInt(g[f] || f, 10),
              f = domUtils.getComputedStyle(h, "border-left-width"),
              e = parseInt(g[f] || f, 10),
              {
                tableBorder: c,
                tdPadding: d,
                tdBorder: e
              };
            b = a.document.createElement("table"),
              b.insertRow(0).insertCell(0).innerHTML = "xxx",
              a.body.appendChild(b);
            var h = b.getElementsByTagName("td")[0];
            return f = domUtils.getComputedStyle(b, "border-left-width"),
              c = parseInt(g[f] || f, 10),
              f = domUtils.getComputedStyle(h, "padding-left"),
              d = parseInt(g[f] || f, 10),
              f = domUtils.getComputedStyle(h, "border-left-width"),
              e = parseInt(g[f] || f, 10),
              domUtils.remove(b),
              {
                tableBorder: c,
                tdPadding: d,
                tdBorder: e
              }
          },
          b.getUETable = function(a) {
            var c = a.tagName.toLowerCase();
            return a = "td" == c || "th" == c || "caption" == c ? domUtils.findParentByTagName(a, "table", !0) : a,
            a.ueTable || (a.ueTable = new b(a)),
              a.ueTable
          },
          b.cloneCell = function(a, b, c) {
            if (!a || utils.isString(a)) return this.table.ownerDocument.createElement(a || "td");
            var d = domUtils.hasClass(a, "selectTdClass");
            d && domUtils.removeClasses(a, "selectTdClass");
            var e = a.cloneNode(!0);
            return b && (e.rowSpan = e.colSpan = 1),
            !c && domUtils.removeAttributes(e, "width height"),
            !c && domUtils.removeAttributes(e, "style"),
              e.style.borderLeftStyle = "",
              e.style.borderTopStyle = "",
              e.style.borderLeftColor = a.style.borderRightColor,
              e.style.borderLeftWidth = a.style.borderRightWidth,
              e.style.borderTopColor = a.style.borderBottomColor,
              e.style.borderTopWidth = a.style.borderBottomWidth,
            d && domUtils.addClass(a, "selectTdClass"),
              e
          },
          b.prototype = {
            getMaxRows: function() {
              for (var a, b = this.table.rows,
                     c = 1,
                     d = 0; a = b[d]; d++) {
                for (var e, f = 1,
                       g = 0; e = a.cells[g++];) f = Math.max(e.rowSpan || 1, f);
                c = Math.max(f + d, c)
              }
              return c
            },
            getMaxCols: function() {
              for (var a, b = this.table.rows,
                     c = 0,
                     d = {},
                     e = 0; a = b[e]; e++) {
                for (var f, g = 0,
                       h = 0; f = a.cells[h++];) if (g += f.colSpan || 1, f.rowSpan && f.rowSpan > 1) for (var i = 1; i < f.rowSpan; i++) d["row_" + (e + i)] ? d["row_" + (e + i)]++:d["row_" + (e + i)] = f.colSpan || 1;
                g += d["row_" + e] || 0,
                  c = Math.max(g, c)
              }
              return c
            },
            getCellColIndex: function(a) {},
            getHSideCell: function(b, c) {
              try {
                var d, e, f = this.getCellInfo(b),
                  g = this.selectedTds.length,
                  h = this.cellsRange;
                return ! c && (g ? !h.beginColIndex: !f.colIndex) || c && (g ? h.endColIndex == this.colsNum - 1 : f.colIndex == this.colsNum - 1) ? null: (d = g ? h.beginRowIndex: f.rowIndex, e = c ? g ? h.endColIndex + 1 : f.colIndex + 1 : g ? h.beginColIndex - 1 : f.colIndex < 1 ? 0 : f.colIndex - 1, this.getCell(this.indexTable[d][e].rowIndex, this.indexTable[d][e].cellIndex))
              } catch(i) {
                a(i)
              }
            },
            getTabNextCell: function(a, b) {
              var c, d = this.getCellInfo(a),
                e = b || d.rowIndex,
                f = d.colIndex + 1 + (d.colSpan - 1);
              try {
                c = this.getCell(this.indexTable[e][f].rowIndex, this.indexTable[e][f].cellIndex)
              } catch(g) {
                try {
                  e = 1 * e + 1,
                    f = 0,
                    c = this.getCell(this.indexTable[e][f].rowIndex, this.indexTable[e][f].cellIndex)
                } catch(g) {}
              }
              return c
            },
            getVSideCell: function(b, c, d) {
              try {
                var e, f, g = this.getCellInfo(b),
                  h = this.selectedTds.length && !d,
                  i = this.cellsRange;
                return ! c && 0 == g.rowIndex || c && (h ? i.endRowIndex == this.rowsNum - 1 : g.rowIndex + g.rowSpan > this.rowsNum - 1) ? null: (e = c ? h ? i.endRowIndex + 1 : g.rowIndex + g.rowSpan: h ? i.beginRowIndex - 1 : g.rowIndex - 1, f = h ? i.beginColIndex: g.colIndex, this.getCell(this.indexTable[e][f].rowIndex, this.indexTable[e][f].cellIndex))
              } catch(j) {
                a(j)
              }
            },
            getSameEndPosCells: function(b, c) {
              try {
                for (var d = "x" === c.toLowerCase(), e = domUtils.getXY(b)[d ? "x": "y"] + b["offset" + (d ? "Width": "Height")], f = this.table.rows, g = null, h = [], i = 0; i < this.rowsNum; i++) {
                  g = f[i].cells;
                  for (var j, k = 0; j = g[k++];) {
                    var l = domUtils.getXY(j)[d ? "x": "y"] + j["offset" + (d ? "Width": "Height")];
                    if (l > e && d) break;
                    if ((b == j || e == l) && (1 == j[d ? "colSpan": "rowSpan"] && h.push(j), d)) break
                  }
                }
                return h
              } catch(m) {
                a(m)
              }
            },
            setCellContent: function(a, b) {
              a.innerHTML = b || (browser.ie ? domUtils.fillChar: "<br />")
            },
            cloneCell: b.cloneCell,
            getSameStartPosXCells: function(b) {
              try {
                for (var c, d = domUtils.getXY(b).x + b.offsetWidth, e = this.table.rows, f = [], g = 0; g < this.rowsNum; g++) {
                  c = e[g].cells;
                  for (var h, i = 0; h = c[i++];) {
                    var j = domUtils.getXY(h).x;
                    if (j > d) break;
                    if (j == d && 1 == h.colSpan) {
                      f.push(h);
                      break
                    }
                  }
                }
                return f
              } catch(k) {
                a(k)
              }
            },
            update: function(a) {
              this.table = a || this.table,
                this.selectedTds = [],
                this.cellsRange = {},
                this.indexTable = [];
              for (var b = this.table.rows,
                     c = this.getMaxRows(), d = c - b.length, e = this.getMaxCols(); d--;) this.table.insertRow(b.length);
              this.rowsNum = c,
                this.colsNum = e;
              for (var f = 0,
                     g = b.length; f < g; f++) this.indexTable[f] = new Array(e);
              for (var h, i = 0; h = b[i]; i++) for (var j, k = 0,
                                                       l = h.cells; j = l[k]; k++) {
                j.rowSpan > c && (j.rowSpan = c);
                for (var m = k,
                       n = j.rowSpan || 1,
                       o = j.colSpan || 1; this.indexTable[i][m];) m++;
                for (var p = 0; p < n; p++) for (var q = 0; q < o; q++) this.indexTable[i + p][m + q] = {
                  rowIndex: i,
                  cellIndex: k,
                  colIndex: m,
                  rowSpan: n,
                  colSpan: o
                }
              }
              for (p = 0; p < c; p++) for (q = 0; q < e; q++) void 0 === this.indexTable[p][q] && (h = b[p], j = h.cells[h.cells.length - 1], j = j ? j.cloneNode(!0) : this.table.ownerDocument.createElement("td"), this.setCellContent(j), 1 !== j.colSpan && (j.colSpan = 1), 1 !== j.rowSpan && (j.rowSpan = 1), h.appendChild(j), this.indexTable[p][q] = {
                rowIndex: p,
                cellIndex: j.cellIndex,
                colIndex: q,
                rowSpan: 1,
                colSpan: 1
              });
              var r = domUtils.getElementsByTagName(this.table, "td"),
                s = [];
              if (utils.each(r,
                function(a) {
                  domUtils.hasClass(a, "selectTdClass") && s.push(a)
                }), s.length) {
                var t = s[0],
                  u = s[s.length - 1],
                  v = this.getCellInfo(t),
                  w = this.getCellInfo(u);
                this.selectedTds = s,
                  this.cellsRange = {
                    beginRowIndex: v.rowIndex,
                    beginColIndex: v.colIndex,
                    endRowIndex: w.rowIndex + w.rowSpan - 1,
                    endColIndex: w.colIndex + w.colSpan - 1
                  }
              }
              if (!domUtils.hasClass(this.table.rows[0], "firstRow")) {
                domUtils.addClass(this.table.rows[0], "firstRow");
                for (var f = 1; f < this.table.rows.length; f++) domUtils.removeClasses(this.table.rows[f], "firstRow")
              }
            },
            getCellInfo: function(a) {
              if (a) for (var b = a.cellIndex,
                            c = a.parentNode.rowIndex,
                            d = this.indexTable[c], e = this.colsNum, f = b; f < e; f++) {
                var g = d[f];
                if (g.rowIndex === c && g.cellIndex === b) return g
              }
            },
            getCell: function(a, b) {
              return a < this.rowsNum && this.table.rows[a].cells[b] || null
            },
            deleteCell: function(a, b) {
              b = "number" == typeof b ? b: a.parentNode.rowIndex;
              var c = this.table.rows[b];
              c.deleteCell(a.cellIndex)
            },
            getCellsRange: function(a, b) {
              function c(a, b, e, f) {
                var g, h, i, j = a,
                  k = b,
                  l = e,
                  m = f;
                if (a > 0) for (h = b; h < f; h++) g = d.indexTable[a][h],
                  i = g.rowIndex,
                i < a && (j = Math.min(i, j));
                if (f < d.colsNum) for (i = a; i < e; i++) g = d.indexTable[i][f],
                  h = g.colIndex + g.colSpan - 1,
                h > f && (m = Math.max(h, m));
                if (e < d.rowsNum) for (h = b; h < f; h++) g = d.indexTable[e][h],
                  i = g.rowIndex + g.rowSpan - 1,
                i > e && (l = Math.max(i, l));
                if (b > 0) for (i = a; i < e; i++) g = d.indexTable[i][b],
                  h = g.colIndex,
                h < b && (k = Math.min(g.colIndex, k));
                return j != a || k != b || l != e || m != f ? c(j, k, l, m) : {
                  beginRowIndex: a,
                  beginColIndex: b,
                  endRowIndex: e,
                  endColIndex: f
                }
              }
              try {
                var d = this,
                  e = d.getCellInfo(a);
                if (a === b) return {
                  beginRowIndex: e.rowIndex,
                  beginColIndex: e.colIndex,
                  endRowIndex: e.rowIndex + e.rowSpan - 1,
                  endColIndex: e.colIndex + e.colSpan - 1
                };
                var f = d.getCellInfo(b),
                  g = Math.min(e.rowIndex, f.rowIndex),
                  h = Math.min(e.colIndex, f.colIndex),
                  i = Math.max(e.rowIndex + e.rowSpan - 1, f.rowIndex + f.rowSpan - 1),
                  j = Math.max(e.colIndex + e.colSpan - 1, f.colIndex + f.colSpan - 1);
                return c(g, h, i, j)
              } catch(k) {}
            },
            getCells: function(a) {
              this.clearSelected();
              for (var b, c, d, e = a.beginRowIndex,
                     f = a.beginColIndex,
                     g = a.endRowIndex,
                     h = a.endColIndex,
                     i = {},
                     j = [], k = e; k <= g; k++) for (var l = f; l <= h; l++) {
                b = this.indexTable[k][l],
                  c = b.rowIndex,
                  d = b.colIndex;
                var m = c + "|" + d;
                if (!i[m]) {
                  if (i[m] = 1, c < k || d < l || c + b.rowSpan - 1 > g || d + b.colSpan - 1 > h) return null;
                  j.push(this.getCell(c, b.cellIndex))
                }
              }
              return j
            },
            clearSelected: function() {
              b.removeSelectedClass(this.selectedTds),
                this.selectedTds = [],
                this.cellsRange = {}
            },
            setSelected: function(a) {
              var c = this.getCells(a);
              b.addSelectedClass(c),
                this.selectedTds = c,
                this.cellsRange = a
            },
            isFullRow: function() {
              var a = this.cellsRange;
              return a.endColIndex - a.beginColIndex + 1 == this.colsNum
            },
            isFullCol: function() {
              var a = this.cellsRange,
                b = this.table,
                c = b.getElementsByTagName("th"),
                d = a.endRowIndex - a.beginRowIndex + 1;
              return c.length ? d == this.rowsNum || d == this.rowsNum - 1 : d == this.rowsNum
            },
            getNextCell: function(b, c, d) {
              try {
                var e, f, g = this.getCellInfo(b),
                  h = this.selectedTds.length && !d,
                  i = this.cellsRange;
                return ! c && 0 == g.rowIndex || c && (h ? i.endRowIndex == this.rowsNum - 1 : g.rowIndex + g.rowSpan > this.rowsNum - 1) ? null: (e = c ? h ? i.endRowIndex + 1 : g.rowIndex + g.rowSpan: h ? i.beginRowIndex - 1 : g.rowIndex - 1, f = h ? i.beginColIndex: g.colIndex, this.getCell(this.indexTable[e][f].rowIndex, this.indexTable[e][f].cellIndex))
              } catch(j) {
                a(j)
              }
            },
            getPreviewCell: function(b, c) {
              try {
                var d, e, f = this.getCellInfo(b),
                  g = this.selectedTds.length,
                  h = this.cellsRange;
                return ! c && (g ? !h.beginColIndex: !f.colIndex) || c && (g ? h.endColIndex == this.colsNum - 1 : f.rowIndex > this.colsNum - 1) ? null: (d = c ? g ? h.beginRowIndex: f.rowIndex < 1 ? 0 : f.rowIndex - 1 : g ? h.beginRowIndex: f.rowIndex, e = c ? g ? h.endColIndex + 1 : f.colIndex: g ? h.beginColIndex - 1 : f.colIndex < 1 ? 0 : f.colIndex - 1, this.getCell(this.indexTable[d][e].rowIndex, this.indexTable[d][e].cellIndex))
              } catch(i) {
                a(i)
              }
            },
            moveContent: function(a, c) {
              if (!b.isEmptyBlock(c)) {
                if (b.isEmptyBlock(a)) return void(a.innerHTML = c.innerHTML);
                var d = a.lastChild;
                for (3 != d.nodeType && dtd.$block[d.tagName] || a.appendChild(a.ownerDocument.createElement("br")); d = c.firstChild;) a.appendChild(d)
              }
            },
            mergeRight: function(a) {
              var b = this.getCellInfo(a),
                c = b.colIndex + b.colSpan,
                d = this.indexTable[b.rowIndex][c],
                e = this.getCell(d.rowIndex, d.cellIndex);
              a.colSpan = b.colSpan + d.colSpan,
                a.removeAttribute("width"),
                this.moveContent(a, e),
                this.deleteCell(e, d.rowIndex),
                this.update()
            },
            mergeDown: function(a) {
              var b = this.getCellInfo(a),
                c = b.rowIndex + b.rowSpan,
                d = this.indexTable[c][b.colIndex],
                e = this.getCell(d.rowIndex, d.cellIndex);
              a.rowSpan = b.rowSpan + d.rowSpan,
                a.removeAttribute("height"),
                this.moveContent(a, e),
                this.deleteCell(e, d.rowIndex),
                this.update()
            },
            mergeRange: function() {
              var a = this.cellsRange,
                b = this.getCell(a.beginRowIndex, this.indexTable[a.beginRowIndex][a.beginColIndex].cellIndex);
              if ("TH" == b.tagName && a.endRowIndex !== a.beginRowIndex) {
                var c = this.indexTable,
                  d = this.getCellInfo(b);
                b = this.getCell(1, c[1][d.colIndex].cellIndex),
                  a = this.getCellsRange(b, this.getCell(c[this.rowsNum - 1][d.colIndex].rowIndex, c[this.rowsNum - 1][d.colIndex].cellIndex))
              }
              for (var e, f = this.getCells(a), g = 0; e = f[g++];) e !== b && (this.moveContent(b, e), this.deleteCell(e));
              if (b.rowSpan = a.endRowIndex - a.beginRowIndex + 1, b.rowSpan > 1 && b.removeAttribute("height"), b.colSpan = a.endColIndex - a.beginColIndex + 1, b.colSpan > 1 && b.removeAttribute("width"), b.rowSpan == this.rowsNum && 1 != b.colSpan && (b.colSpan = 1), b.colSpan == this.colsNum && 1 != b.rowSpan) {
                var h = b.parentNode.rowIndex;
                if (this.table.deleteRow) for (var g = h + 1,
                                                 i = h + 1,
                                                 j = b.rowSpan; g < j; g++) this.table.deleteRow(i);
                else for (var g = 0,
                            j = b.rowSpan - 1; g < j; g++) {
                  var k = this.table.rows[h + 1];
                  k.parentNode.removeChild(k)
                }
                b.rowSpan = 1
              }
              this.update()
            },
            insertRow: function(a, b) {
              function c(a, b, c) {
                if (0 == a) {
                  var d = c.nextSibling || c.previousSibling,
                    e = d.cells[a];
                  "TH" == e.tagName && (e = b.ownerDocument.createElement("th"), e.appendChild(b.firstChild), c.insertBefore(e, b), domUtils.remove(b))
                } else if ("TH" == b.tagName) {
                  var f = b.ownerDocument.createElement("td");
                  f.appendChild(b.firstChild),
                    c.insertBefore(f, b),
                    domUtils.remove(b)
                }
              }
              var d, e = this.colsNum,
                f = this.table,
                g = f.insertRow(a),
                h = "string" == typeof b && "TH" == b.toUpperCase();
              if (0 == a || a == this.rowsNum) for (var i = 0; i < e; i++) d = this.cloneCell(b, !0),
                this.setCellContent(d),
              d.getAttribute("vAlign") && d.setAttribute("vAlign", d.getAttribute("vAlign")),
                g.appendChild(d),
              h || c(i, d, g);
              else {
                var j = this.indexTable[a];
                for (i = 0; i < e; i++) {
                  var k = j[i];
                  k.rowIndex < a ? (d = this.getCell(k.rowIndex, k.cellIndex), d.rowSpan = k.rowSpan + 1) : (d = this.cloneCell(b, !0), this.setCellContent(d), g.appendChild(d)),
                  h || c(i, d, g)
                }
              }
              return this.update(),
                g
            },
            deleteRow: function(a) {
              for (var b = this.table.rows[a], c = this.indexTable[a], d = this.colsNum, e = 0, f = 0; f < d;) {
                var g = c[f],
                  h = this.getCell(g.rowIndex, g.cellIndex);
                if (h.rowSpan > 1 && g.rowIndex == a) {
                  var i = h.cloneNode(!0);
                  i.rowSpan = h.rowSpan - 1,
                    i.innerHTML = "",
                    h.rowSpan = 1;
                  var j, k = a + 1,
                    l = this.table.rows[k],
                    m = this.getPreviewMergedCellsNum(k, f) - e;
                  m < f ? (j = f - m - 1, domUtils.insertAfter(l.cells[j], i)) : l.cells.length && l.insertBefore(i, l.cells[0]),
                    e += 1
                }
                f += h.colSpan || 1
              }
              var n = [],
                o = {};
              for (f = 0; f < d; f++) {
                var p = c[f].rowIndex,
                  q = c[f].cellIndex,
                  r = p + "_" + q;
                o[r] || (o[r] = 1, h = this.getCell(p, q), n.push(h))
              }
              var s = [];
              utils.each(n,
                function(a) {
                  1 == a.rowSpan ? a.parentNode.removeChild(a) : s.push(a)
                }),
                utils.each(s,
                  function(a) {
                    a.rowSpan--
                  }),
                b.parentNode.removeChild(b),
                this.update()
            },
            insertCol: function(a, b, c) {
              function d(a, b, c) {
                if (0 == a) {
                  var d = b.nextSibling || b.previousSibling;
                  "TH" == d.tagName && (d = b.ownerDocument.createElement("th"), d.appendChild(b.firstChild), c.insertBefore(d, b), domUtils.remove(b))
                } else if ("TH" == b.tagName) {
                  var e = b.ownerDocument.createElement("td");
                  e.appendChild(b.firstChild),
                    c.insertBefore(e, b),
                    domUtils.remove(b)
                }
              }
              var e, f, g, h = this.rowsNum,
                i = 0,
                j = parseInt((this.table.offsetWidth - 20 * (this.colsNum + 1) - (this.colsNum + 1)) / (this.colsNum + 1), 10),
                k = "string" == typeof b && "TH" == b.toUpperCase();
              if (0 == a || a == this.colsNum) for (; i < h; i++) e = this.table.rows[i],
                g = e.cells[0 == a ? a: e.cells.length],
                f = this.cloneCell(b, !0),
                this.setCellContent(f),
                f.setAttribute("vAlign", f.getAttribute("vAlign")),
              g && f.setAttribute("width", g.getAttribute("width")),
                a ? domUtils.insertAfter(e.cells[e.cells.length - 1], f) : e.insertBefore(f, e.cells[0]),
              k || d(i, f, e);
              else for (; i < h; i++) {
                var l = this.indexTable[i][a];
                l.colIndex < a ? (f = this.getCell(l.rowIndex, l.cellIndex), f.colSpan = l.colSpan + 1) : (e = this.table.rows[i], g = e.cells[l.cellIndex], f = this.cloneCell(b, !0), this.setCellContent(f), f.setAttribute("vAlign", f.getAttribute("vAlign")), g && f.setAttribute("width", g.getAttribute("width")), g ? e.insertBefore(f, g) : e.appendChild(f)),
                k || d(i, f, e)
              }
              this.update(),
                this.updateWidth(j, c || {
                  tdPadding: 10,
                  tdBorder: 1
                })
            },
            updateWidth: function(a, c) {
              var d = this.table,
                e = b.getWidth(d) - 2 * c.tdPadding - c.tdBorder + a;
              if (e < d.ownerDocument.body.offsetWidth) return void d.setAttribute("width", e);
              var f = domUtils.getElementsByTagName(this.table, "td th");
              utils.each(f,
                function(b) {
                  b.setAttribute("width", a)
                })
            },
            deleteCol: function(a) {
              for (var b = this.indexTable,
                     c = this.table.rows,
                     d = this.table.getAttribute("width"), e = 0, f = this.rowsNum, g = {},
                     h = 0; h < f;) {
                var i = b[h],
                  j = i[a],
                  k = j.rowIndex + "_" + j.colIndex;
                if (!g[k]) {
                  g[k] = 1;
                  var l = this.getCell(j.rowIndex, j.cellIndex);
                  e || (e = l && parseInt(l.offsetWidth / l.colSpan, 10).toFixed(0)),
                    l.colSpan > 1 ? l.colSpan--:c[h].deleteCell(j.cellIndex),
                    h += j.rowSpan || 1
                }
              }
              this.table.setAttribute("width", d - e),
                this.update()
            },
            splitToCells: function(a) {
              var b = this,
                c = this.splitToRows(a);
              utils.each(c,
                function(a) {
                  b.splitToCols(a)
                })
            },
            splitToRows: function(a) {
              var b = this.getCellInfo(a),
                c = b.rowIndex,
                d = b.colIndex,
                e = [];
              a.rowSpan = 1,
                e.push(a);
              for (var f = c,
                     g = c + b.rowSpan; f < g; f++) if (f != c) {
                var h = this.table.rows[f],
                  i = h.insertCell(d - this.getPreviewMergedCellsNum(f, d));
                i.colSpan = b.colSpan,
                  this.setCellContent(i),
                  i.setAttribute("vAlign", a.getAttribute("vAlign")),
                  i.setAttribute("align", a.getAttribute("align")),
                a.style.cssText && (i.style.cssText = a.style.cssText),
                  e.push(i)
              }
              return this.update(),
                e
            },
            getPreviewMergedCellsNum: function(a, b) {
              for (var c = this.indexTable[a], d = 0, e = 0; e < b;) {
                var f = c[e].colSpan,
                  g = c[e].rowIndex;
                d += f - (g == a ? 1 : 0),
                  e += f
              }
              return d
            },
            splitToCols: function(a) {
              var b = (a.offsetWidth / a.colSpan - 22).toFixed(0),
                c = this.getCellInfo(a),
                d = c.rowIndex,
                e = c.colIndex,
                f = [];
              a.colSpan = 1,
                a.setAttribute("width", b),
                f.push(a);
              for (var g = e,
                     h = e + c.colSpan; g < h; g++) if (g != e) {
                var i = this.table.rows[d],
                  j = i.insertCell(this.indexTable[d][g].cellIndex + 1);
                if (j.rowSpan = c.rowSpan, this.setCellContent(j), j.setAttribute("vAlign", a.getAttribute("vAlign")), j.setAttribute("align", a.getAttribute("align")), j.setAttribute("width", b), a.style.cssText && (j.style.cssText = a.style.cssText), "TH" == a.tagName) {
                  var k = a.ownerDocument.createElement("th");
                  k.appendChild(j.firstChild),
                    k.setAttribute("vAlign", a.getAttribute("vAlign")),
                    k.rowSpan = j.rowSpan,
                    i.insertBefore(k, j),
                    domUtils.remove(j)
                }
                f.push(j)
              }
              return this.update(),
                f
            },
            isLastCell: function(a, b, c) {
              b = b || this.rowsNum,
                c = c || this.colsNum;
              var d = this.getCellInfo(a);
              return d.rowIndex + d.rowSpan == b && d.colIndex + d.colSpan == c
            },
            getLastCell: function(a) {
              a = a || this.table.getElementsByTagName("td");
              var b, c = (this.getCellInfo(a[0]), this),
                d = a[0],
                e = d.parentNode,
                f = 0,
                g = 0;
              return utils.each(a,
                function(a) {
                  a.parentNode == e && (g += a.colSpan || 1),
                    f += a.rowSpan * a.colSpan || 1
                }),
                b = f / g,
                utils.each(a,
                  function(a) {
                    if (c.isLastCell(a, b, g)) return d = a,
                      !1
                  }),
                d
            },
            selectRow: function(a) {
              var b = this.indexTable[a],
                c = this.getCell(b[0].rowIndex, b[0].cellIndex),
                d = this.getCell(b[this.colsNum - 1].rowIndex, b[this.colsNum - 1].cellIndex),
                e = this.getCellsRange(c, d);
              this.setSelected(e)
            },
            selectTable: function() {
              var a = this.table.getElementsByTagName("td"),
                b = this.getCellsRange(a[0], a[a.length - 1]);
              this.setSelected(b)
            },
            setBackground: function(a, b) {
              if ("string" == typeof b) utils.each(a,
                function(a) {
                  a.style.backgroundColor = b
                });
              else if ("object" == typeof b) {
                b = utils.extend({
                    repeat: !0,
                    colorList: ["#ddd", "#fff"]
                  },
                  b);
                for (var c, d = this.getCellInfo(a[0]).rowIndex, e = 0, f = b.colorList, g = function(a, b, c) {
                    return a[b] ? a[b] : c ? a[b % a.length] : ""
                  },
                       h = 0; c = a[h++];) {
                  var i = this.getCellInfo(c);
                  c.style.backgroundColor = g(f, d + e == i.rowIndex ? e: ++e, b.repeat)
                }
              }
            },
            removeBackground: function(a) {
              utils.each(a,
                function(a) {
                  a.style.backgroundColor = ""
                })
            }
          }
      } (),
      function() {
        function a(a, c) {
          var d = domUtils.getElementsByTagName(a, "td th");
          utils.each(d,
            function(a) {
              a.removeAttribute("width")
            }),
            a.setAttribute("width", b(c, !0, g(c, a)));
          var e = [];
          setTimeout(function() {
              utils.each(d,
                function(a) {
                  1 == a.colSpan && e.push(a.offsetWidth)
                }),
                utils.each(d,
                  function(a, b) {
                    1 == a.colSpan && a.setAttribute("width", e[b] + "")
                  })
            },
            0)
        }
        function b(a, b, c) {
          var d = a.body;
          return d.offsetWidth - (b ? 2 * parseInt(domUtils.getComputedStyle(d, "margin-left"), 10) : 0) - 2 * c.tableBorder - (a.options.offsetWidth || 0)
        }
        function c(a) {
          var b = e(a).cell;
          if (b) {
            var c = h(b);
            return c.selectedTds.length ? c.selectedTds: [b]
          }
          return []
        }
        var d = UE.UETable,
          e = function(a) {
            return d.getTableItemsByRange(a)
          },
          f = function(a) {
            return d.getUETableBySelected(a)
          },
          g = function(a, b) {
            return d.getDefaultValue(a, b)
          },
          h = function(a) {
            return d.getUETable(a)
          };
        UE.commands.inserttable = {
          queryCommandState: function() {
            return e(this).table ? -1 : 0
          },
          execCommand: function(a, b) {
            function c(a, b) {
              for (var c = [], d = a.numRows, e = a.numCols, f = 0; f < d; f++) {
                c.push("<tr" + (0 == f ? ' class="firstRow"': "") + ">");
                for (var g = 0; g < e; g++) c.push('<td width="' + b + '"  vAlign="' + a.tdvalign + '" >' + (browser.ie && browser.version < 11 ? domUtils.fillChar: "<br/>") + "</td>");
                c.push("</tr>")
              }
              return "<table><tbody>" + c.join("") + "</tbody></table>"
            }
            b || (b = utils.extend({},
              {
                numCols: this.options.defaultCols,
                numRows: this.options.defaultRows,
                tdvalign: this.options.tdvalign
              }));
            var d = this,
              e = this.selection.getRange(),
              f = e.startContainer,
              h = domUtils.findParent(f,
                function(a) {
                  return domUtils.isBlockElm(a)
                },
                !0) || d.body,
              i = g(d),
              j = h.offsetWidth,
              k = Math.floor(j / b.numCols - 2 * i.tdPadding - i.tdBorder); ! b.tdvalign && (b.tdvalign = d.options.tdvalign),
              d.execCommand("inserthtml", c(b, k))
          }
        },
          UE.commands.insertparagraphbeforetable = {
            queryCommandState: function() {
              return e(this).cell ? 0 : -1
            },
            execCommand: function() {
              var a = e(this).table;
              if (a) {
                var b = this.document.createElement("p");
                b.innerHTML = browser.ie ? "&nbsp;": "<br />",
                  a.parentNode.insertBefore(b, a),
                  this.selection.getRange().setStart(b, 0).setCursor()
              }
            }
          },
          UE.commands.deletetable = {
            queryCommandState: function() {
              var a = this.selection.getRange();
              return domUtils.findParentByTagName(a.startContainer, "table", !0) ? 0 : -1
            },
            execCommand: function(a, b) {
              var c = this.selection.getRange();
              if (b = b || domUtils.findParentByTagName(c.startContainer, "table", !0)) {
                var d = b.nextSibling;
                d || (d = domUtils.createElement(this.document, "p", {
                  innerHTML: browser.ie ? domUtils.fillChar: "<br/>"
                }), b.parentNode.insertBefore(d, b)),
                  domUtils.remove(b),
                  c = this.selection.getRange(),
                  3 == d.nodeType ? c.setStartBefore(d) : c.setStart(d, 0),
                  c.setCursor(!1, !0),
                  this.fireEvent("tablehasdeleted")
              }
            }
          },
          UE.commands.cellalign = {
            queryCommandState: function() {
              return c(this).length ? 0 : -1
            },
            execCommand: function(a, b) {
              var d = c(this);
              if (d.length) for (var e, f = 0; e = d[f++];) e.setAttribute("align", b)
            }
          },
          UE.commands.cellvalign = {
            queryCommandState: function() {
              return c(this).length ? 0 : -1
            },
            execCommand: function(a, b) {
              var d = c(this);
              if (d.length) for (var e, f = 0; e = d[f++];) e.setAttribute("vAlign", b)
            }
          },
          UE.commands.insertcaption = {
            queryCommandState: function() {
              var a = e(this).table;
              return a && 0 == a.getElementsByTagName("caption").length ? 1 : -1
            },
            execCommand: function() {
              var a = e(this).table;
              if (a) {
                var b = this.document.createElement("caption");
                b.innerHTML = browser.ie ? domUtils.fillChar: "<br/>",
                  a.insertBefore(b, a.firstChild);
                var c = this.selection.getRange();
                c.setStart(b, 0).setCursor()
              }
            }
          },
          UE.commands.deletecaption = {
            queryCommandState: function() {
              var a = this.selection.getRange(),
                b = domUtils.findParentByTagName(a.startContainer, "table");
              return b ? 0 == b.getElementsByTagName("caption").length ? -1 : 1 : -1
            },
            execCommand: function() {
              var a = this.selection.getRange(),
                b = domUtils.findParentByTagName(a.startContainer, "table");
              if (b) {
                domUtils.remove(b.getElementsByTagName("caption")[0]);
                var c = this.selection.getRange();
                c.setStart(b.rows[0].cells[0], 0).setCursor()
              }
            }
          },
          UE.commands.inserttitle = {
            queryCommandState: function() {
              var a = e(this).table;
              if (a) {
                var b = a.rows[0];
                return "th" != b.cells[b.cells.length - 1].tagName.toLowerCase() ? 0 : -1
              }
              return - 1
            },
            execCommand: function() {
              var a = e(this).table;
              a && h(a).insertRow(0, "th");
              var b = a.getElementsByTagName("th")[0];
              this.selection.getRange().setStart(b, 0).setCursor(!1, !0)
            }
          },
          UE.commands.deletetitle = {
            queryCommandState: function() {
              var a = e(this).table;
              if (a) {
                var b = a.rows[0];
                return "th" == b.cells[b.cells.length - 1].tagName.toLowerCase() ? 0 : -1
              }
              return - 1
            },
            execCommand: function() {
              var a = e(this).table;
              a && domUtils.remove(a.rows[0]);
              var b = a.getElementsByTagName("td")[0];
              this.selection.getRange().setStart(b, 0).setCursor(!1, !0)
            }
          },
          UE.commands.inserttitlecol = {
            queryCommandState: function() {
              var a = e(this).table;
              if (a) {
                var b = a.rows[a.rows.length - 1];
                return b.getElementsByTagName("th").length ? -1 : 0
              }
              return - 1
            },
            execCommand: function(b) {
              var c = e(this).table;
              c && h(c).insertCol(0, "th"),
                a(c, this);
              var d = c.getElementsByTagName("th")[0];
              this.selection.getRange().setStart(d, 0).setCursor(!1, !0)
            }
          },
          UE.commands.deletetitlecol = {
            queryCommandState: function() {
              var a = e(this).table;
              if (a) {
                var b = a.rows[a.rows.length - 1];
                return b.getElementsByTagName("th").length ? 0 : -1
              }
              return - 1
            },
            execCommand: function() {
              var b = e(this).table;
              if (b) for (var c = 0; c < b.rows.length; c++) domUtils.remove(b.rows[c].children[0]);
              a(b, this);
              var d = b.getElementsByTagName("td")[0];
              this.selection.getRange().setStart(d, 0).setCursor(!1, !0)
            }
          },
          UE.commands.mergeright = {
            queryCommandState: function(a) {
              var b = e(this),
                c = b.table,
                d = b.cell;
              if (!c || !d) return - 1;
              var f = h(c);
              if (f.selectedTds.length) return - 1;
              var g = f.getCellInfo(d),
                i = g.colIndex + g.colSpan;
              if (i >= f.colsNum) return - 1;
              var j = f.indexTable[g.rowIndex][i],
                k = c.rows[j.rowIndex].cells[j.cellIndex];
              return k && d.tagName == k.tagName && j.rowIndex == g.rowIndex && j.rowSpan == g.rowSpan ? 0 : -1
            },
            execCommand: function(a) {
              var b = this.selection.getRange(),
                c = b.createBookmark(!0),
                d = e(this).cell,
                f = h(d);
              f.mergeRight(d),
                b.moveToBookmark(c).select()
            }
          },
          UE.commands.mergedown = {
            queryCommandState: function(a) {
              var b = e(this),
                c = b.table,
                d = b.cell;
              if (!c || !d) return - 1;
              var f = h(c);
              if (f.selectedTds.length) return - 1;
              var g = f.getCellInfo(d),
                i = g.rowIndex + g.rowSpan;
              if (i >= f.rowsNum) return - 1;
              var j = f.indexTable[i][g.colIndex],
                k = c.rows[j.rowIndex].cells[j.cellIndex];
              return k && d.tagName == k.tagName && j.colIndex == g.colIndex && j.colSpan == g.colSpan ? 0 : -1
            },
            execCommand: function() {
              var a = this.selection.getRange(),
                b = a.createBookmark(!0),
                c = e(this).cell,
                d = h(c);
              d.mergeDown(c),
                a.moveToBookmark(b).select()
            }
          },
          UE.commands.mergecells = {
            queryCommandState: function() {
              return f(this) ? 0 : -1
            },
            execCommand: function() {
              var a = f(this);
              if (a && a.selectedTds.length) {
                var b = a.selectedTds[0];
                a.mergeRange();
                var c = this.selection.getRange();
                domUtils.isEmptyBlock(b) ? c.setStart(b, 0).collapse(!0) : c.selectNodeContents(b),
                  c.select()
              }
            }
          },
          UE.commands.insertrow = {
            queryCommandState: function() {
              var a = e(this),
                b = a.cell;
              return b && ("TD" == b.tagName || "TH" == b.tagName && a.tr !== a.table.rows[0]) && h(a.table).rowsNum < this.options.maxRowNum ? 0 : -1
            },
            execCommand: function() {
              var a = this.selection.getRange(),
                b = a.createBookmark(!0),
                c = e(this),
                d = c.cell,
                f = c.table,
                g = h(f),
                i = g.getCellInfo(d);
              if (g.selectedTds.length) for (var j = g.cellsRange,
                                               k = 0,
                                               l = j.endRowIndex - j.beginRowIndex + 1; k < l; k++) g.insertRow(j.beginRowIndex, d);
              else g.insertRow(i.rowIndex, d);
              a.moveToBookmark(b).select(),
              "enabled" === f.getAttribute("interlaced") && this.fireEvent("interlacetable", f)
            }
          },
          UE.commands.insertrownext = {
            queryCommandState: function() {
              var a = e(this),
                b = a.cell;
              return b && "TD" == b.tagName && h(a.table).rowsNum < this.options.maxRowNum ? 0 : -1
            },
            execCommand: function() {
              var a = this.selection.getRange(),
                b = a.createBookmark(!0),
                c = e(this),
                d = c.cell,
                f = c.table,
                g = h(f),
                i = g.getCellInfo(d);
              if (g.selectedTds.length) for (var j = g.cellsRange,
                                               k = 0,
                                               l = j.endRowIndex - j.beginRowIndex + 1; k < l; k++) g.insertRow(j.endRowIndex + 1, d);
              else g.insertRow(i.rowIndex + i.rowSpan, d);
              a.moveToBookmark(b).select(),
              "enabled" === f.getAttribute("interlaced") && this.fireEvent("interlacetable", f)
            }
          },
          UE.commands.deleterow = {
            queryCommandState: function() {
              var a = e(this);
              return a.cell ? 0 : -1
            },
            execCommand: function() {
              var a = e(this).cell,
                b = h(a),
                c = b.cellsRange,
                d = b.getCellInfo(a),
                f = b.getVSideCell(a),
                g = b.getVSideCell(a, !0),
                i = this.selection.getRange();
              if (utils.isEmptyObject(c)) b.deleteRow(d.rowIndex);
              else for (var j = c.beginRowIndex; j < c.endRowIndex + 1; j++) b.deleteRow(c.beginRowIndex);
              var k = b.table;
              if (k.getElementsByTagName("td").length) if (1 == d.rowSpan || d.rowSpan == c.endRowIndex - c.beginRowIndex + 1)(g || f) && i.selectNodeContents(g || f).setCursor(!1, !0);
              else {
                var l = b.getCell(d.rowIndex, b.indexTable[d.rowIndex][d.colIndex].cellIndex);
                l && i.selectNodeContents(l).setCursor(!1, !0)
              } else {
                var m = k.nextSibling;
                domUtils.remove(k),
                m && i.setStart(m, 0).setCursor(!1, !0)
              }
              "enabled" === k.getAttribute("interlaced") && this.fireEvent("interlacetable", k)
            }
          },
          UE.commands.insertcol = {
            queryCommandState: function(a) {
              var b = e(this),
                c = b.cell;
              return c && ("TD" == c.tagName || "TH" == c.tagName && c !== b.tr.cells[0]) && h(b.table).colsNum < this.options.maxColNum ? 0 : -1
            },
            execCommand: function(a) {
              var b = this.selection.getRange(),
                c = b.createBookmark(!0);
              if (this.queryCommandState(a) != -1) {
                var d = e(this).cell,
                  f = h(d),
                  g = f.getCellInfo(d);
                if (f.selectedTds.length) for (var i = f.cellsRange,
                                                 j = 0,
                                                 k = i.endColIndex - i.beginColIndex + 1; j < k; j++) f.insertCol(i.beginColIndex, d);
                else f.insertCol(g.colIndex, d);
                b.moveToBookmark(c).select(!0)
              }
            }
          },
          UE.commands.insertcolnext = {
            queryCommandState: function() {
              var a = e(this),
                b = a.cell;
              return b && h(a.table).colsNum < this.options.maxColNum ? 0 : -1
            },
            execCommand: function() {
              var a = this.selection.getRange(),
                b = a.createBookmark(!0),
                c = e(this).cell,
                d = h(c),
                f = d.getCellInfo(c);
              if (d.selectedTds.length) for (var g = d.cellsRange,
                                               i = 0,
                                               j = g.endColIndex - g.beginColIndex + 1; i < j; i++) d.insertCol(g.endColIndex + 1, c);
              else d.insertCol(f.colIndex + f.colSpan, c);
              a.moveToBookmark(b).select()
            }
          },
          UE.commands.deletecol = {
            queryCommandState: function() {
              var a = e(this);
              return a.cell ? 0 : -1
            },
            execCommand: function() {
              var a = e(this).cell,
                b = h(a),
                c = b.cellsRange,
                d = b.getCellInfo(a),
                f = b.getHSideCell(a),
                g = b.getHSideCell(a, !0);
              if (utils.isEmptyObject(c)) b.deleteCol(d.colIndex);
              else for (var i = c.beginColIndex; i < c.endColIndex + 1; i++) b.deleteCol(c.beginColIndex);
              var j = b.table,
                k = this.selection.getRange();
              if (j.getElementsByTagName("td").length) domUtils.inDoc(a, this.document) ? k.setStart(a, 0).setCursor(!1, !0) : g && domUtils.inDoc(g, this.document) ? k.selectNodeContents(g).setCursor(!1, !0) : f && domUtils.inDoc(f, this.document) && k.selectNodeContents(f).setCursor(!0, !0);
              else {
                var l = j.nextSibling;
                domUtils.remove(j),
                l && k.setStart(l, 0).setCursor(!1, !0)
              }
            }
          },
          UE.commands.splittocells = {
            queryCommandState: function() {
              var a = e(this),
                b = a.cell;
              if (!b) return - 1;
              var c = h(a.table);
              return c.selectedTds.length > 0 ? -1 : b && (b.colSpan > 1 || b.rowSpan > 1) ? 0 : -1
            },
            execCommand: function() {
              var a = this.selection.getRange(),
                b = a.createBookmark(!0),
                c = e(this).cell,
                d = h(c);
              d.splitToCells(c),
                a.moveToBookmark(b).select()
            }
          },
          UE.commands.splittorows = {
            queryCommandState: function() {
              var a = e(this),
                b = a.cell;
              if (!b) return - 1;
              var c = h(a.table);
              return c.selectedTds.length > 0 ? -1 : b && b.rowSpan > 1 ? 0 : -1
            },
            execCommand: function() {
              var a = this.selection.getRange(),
                b = a.createBookmark(!0),
                c = e(this).cell,
                d = h(c);
              d.splitToRows(c),
                a.moveToBookmark(b).select()
            }
          },
          UE.commands.splittocols = {
            queryCommandState: function() {
              var a = e(this),
                b = a.cell;
              if (!b) return - 1;
              var c = h(a.table);
              return c.selectedTds.length > 0 ? -1 : b && b.colSpan > 1 ? 0 : -1
            },
            execCommand: function() {
              var a = this.selection.getRange(),
                b = a.createBookmark(!0),
                c = e(this).cell,
                d = h(c);
              d.splitToCols(c),
                a.moveToBookmark(b).select()
            }
          },
          UE.commands.adaptbytext = UE.commands.adaptbywindow = {
            queryCommandState: function() {
              return e(this).table ? 0 : -1
            },
            execCommand: function(b) {
              var c = e(this),
                d = c.table;
              if (d) if ("adaptbywindow" == b) a(d, this);
              else {
                var f = domUtils.getElementsByTagName(d, "td th");
                utils.each(f,
                  function(a) {
                    a.removeAttribute("width")
                  }),
                  d.removeAttribute("width")
              }
            }
          },
          UE.commands.averagedistributecol = {
            queryCommandState: function() {
              var a = f(this);
              return a && (a.isFullRow() || a.isFullCol()) ? 0 : -1
            },
            execCommand: function(a) {
              function b() {
                var a, b = e.table,
                  c = 0,
                  f = 0,
                  h = g(d, b);
                if (e.isFullRow()) c = b.offsetWidth,
                  f = e.colsNum;
                else for (var i, j = e.cellsRange.beginColIndex,
                            k = e.cellsRange.endColIndex,
                            l = j; l <= k;) i = e.selectedTds[l],
                  c += i.offsetWidth,
                  l += i.colSpan,
                  f += 1;
                return a = Math.ceil(c / f) - 2 * h.tdBorder - 2 * h.tdPadding
              }
              function c(a) {
                utils.each(domUtils.getElementsByTagName(e.table, "th"),
                  function(a) {
                    a.setAttribute("width", "")
                  });
                var b = e.isFullRow() ? domUtils.getElementsByTagName(e.table, "td") : e.selectedTds;
                utils.each(b,
                  function(b) {
                    1 == b.colSpan && b.setAttribute("width", a)
                  })
              }
              var d = this,
                e = f(d);
              e && e.selectedTds.length && c(b())
            }
          },
          UE.commands.averagedistributerow = {
            queryCommandState: function() {
              var a = f(this);
              return a ? a.selectedTds && /th/gi.test(a.selectedTds[0].tagName) ? -1 : a.isFullRow() || a.isFullCol() ? 0 : -1 : -1
            },
            execCommand: function(a) {
              function b() {
                var a, b, c = 0,
                  f = e.table,
                  h = g(d, f),
                  i = parseInt(domUtils.getComputedStyle(f.getElementsByTagName("td")[0], "padding-top"));
                if (e.isFullCol()) {
                  var j, k, l = domUtils.getElementsByTagName(f, "caption"),
                    m = domUtils.getElementsByTagName(f, "th");
                  l.length > 0 && (j = l[0].offsetHeight),
                  m.length > 0 && (k = m[0].offsetHeight),
                    c = f.offsetHeight - (j || 0) - (k || 0),
                    b = 0 == m.length ? e.rowsNum: e.rowsNum - 1
                } else {
                  for (var n = e.cellsRange.beginRowIndex,
                         o = e.cellsRange.endRowIndex,
                         p = 0,
                         q = domUtils.getElementsByTagName(f, "tr"), r = n; r <= o; r++) c += q[r].offsetHeight,
                    p += 1;
                  b = p
                }
                return a = browser.ie && browser.version < 9 ? Math.ceil(c / b) : Math.ceil(c / b) - 2 * h.tdBorder - 2 * i
              }
              function c(a) {
                var b = e.isFullCol() ? domUtils.getElementsByTagName(e.table, "td") : e.selectedTds;
                utils.each(b,
                  function(b) {
                    1 == b.rowSpan && b.setAttribute("height", a)
                  })
              }
              var d = this,
                e = f(d);
              e && e.selectedTds.length && c(b())
            }
          },
          UE.commands.cellalignment = {
            queryCommandState: function() {
              return e(this).table ? 0 : -1
            },
            execCommand: function(a, b) {
              var c = this,
                d = f(c);
              if (d) utils.each(d.selectedTds,
                function(a) {
                  domUtils.setAttributes(a, b)
                });
              else {
                var e = c.selection.getStart(),
                  g = e && domUtils.findParentByTagName(e, ["td", "th", "caption"], !0);
                /caption/gi.test(g.tagName) ? (g.style.textAlign = b.align, g.style.verticalAlign = b.vAlign) : domUtils.setAttributes(g, b),
                  c.selection.getRange().setCursor(!0)
              }
            },
            queryCommandValue: function(a) {
              var b = e(this).cell;
              if (b || (b = c(this)[0]), b) {
                var d = UE.UETable.getUETable(b).selectedTds;
                return ! d.length && (d = b),
                  UE.UETable.getTableCellAlignState(d)
              }
              return null
            }
          },
          UE.commands.tablealignment = {
            queryCommandState: function() {
              return browser.ie && browser.version < 8 ? -1 : e(this).table ? 0 : -1
            },
            execCommand: function(a, b) {
              var c = this,
                d = c.selection.getStart(),
                e = d && domUtils.findParentByTagName(d, ["table"], !0);
              e && e.setAttribute("align", b)
            }
          },
          UE.commands.edittable = {
            queryCommandState: function() {
              return e(this).table ? 0 : -1
            },
            execCommand: function(a, b) {
              var c = this.selection.getRange(),
                d = domUtils.findParentByTagName(c.startContainer, "table");
              if (d) {
                var e = domUtils.getElementsByTagName(d, "td").concat(domUtils.getElementsByTagName(d, "th"), domUtils.getElementsByTagName(d, "caption"));
                utils.each(e,
                  function(a) {
                    a.style.borderColor = b
                  })
              }
            }
          },
          UE.commands.edittd = {
            queryCommandState: function() {
              return e(this).table ? 0 : -1
            },
            execCommand: function(a, b) {
              var c = this,
                d = f(c);
              if (d) utils.each(d.selectedTds,
                function(a) {
                  a.style.backgroundColor = b
                });
              else {
                var e = c.selection.getStart(),
                  g = e && domUtils.findParentByTagName(e, ["td", "th", "caption"], !0);
                g && (g.style.backgroundColor = b)
              }
            }
          },
          UE.commands.settablebackground = {
            queryCommandState: function() {
              return c(this).length > 1 ? 0 : -1
            },
            execCommand: function(a, b) {
              var d, e;
              d = c(this),
                e = h(d[0]),
                e.setBackground(d, b)
            }
          },
          UE.commands.cleartablebackground = {
            queryCommandState: function() {
              var a = c(this);
              if (!a.length) return - 1;
              for (var b, d = 0; b = a[d++];) if ("" !== b.style.backgroundColor) return 0;
              return - 1
            },
            execCommand: function() {
              var a = c(this),
                b = h(a[0]);
              b.removeBackground(a)
            }
          },
          UE.commands.interlacetable = UE.commands.uninterlacetable = {
            queryCommandState: function(a) {
              var b = e(this).table;
              if (!b) return - 1;
              var c = b.getAttribute("interlaced");
              return "interlacetable" == a ? "enabled" === c ? -1 : 0 : c && "disabled" !== c ? 0 : -1
            },
            execCommand: function(a, b) {
              var c = e(this).table;
              "interlacetable" == a ? (c.setAttribute("interlaced", "enabled"), this.fireEvent("interlacetable", c, b)) : (c.setAttribute("interlaced", "disabled"), this.fireEvent("uninterlacetable", c))
            }
          },
          UE.commands.setbordervisible = {
            queryCommandState: function(a) {
              var b = e(this).table;
              return b ? 0 : -1
            },
            execCommand: function() {
              var a = e(this).table;
              utils.each(domUtils.getElementsByTagName(a, "td"),
                function(a) {
                  a.style.borderWidth = "1px",
                    a.style.borderStyle = "solid"
                })
            }
          }
      } (),
      UE.plugins.table = function() {
        function a(a) {}
        function b(a, b) {
          c(a, "width", !0),
            c(a, "height", !0)
        }
        function c(a, b, c) {
          a.style[b] && (c && a.setAttribute(b, parseInt(a.style[b], 10)), a.style[b] = "")
        }
        function d(a) {
          if ("TD" == a.tagName || "TH" == a.tagName) return a;
          var b;
          return (b = domUtils.findParentByTagName(a, "td", !0) || domUtils.findParentByTagName(a, "th", !0)) ? b: null
        }
        function e(a) {
          var b = new RegExp(domUtils.fillChar, "g");
          if (a[browser.ie ? "innerText": "textContent"].replace(/^\s*$/, "").replace(b, "").length > 0) return 0;
          for (var c in dtd.$isNotEmpty) if (a.getElementsByTagName(c).length) return 0;
          return 1
        }
        function f(a) {
          return a.pageX || a.pageY ? {
            x: a.pageX,
            y: a.pageY
          }: {
            x: a.clientX + N.document.body.scrollLeft - N.document.body.clientLeft,
            y: a.clientY + N.document.body.scrollTop - N.document.body.clientTop
          }
        }
        function g(b) {
          if (!A()) try {
            var c, e = d(b.target || b.srcElement);
            if (R && (N.body.style.webkitUserSelect = "none", (Math.abs(V.x - b.clientX) > T || Math.abs(V.y - b.clientY) > T) && (t(), R = !1, U = 0, v(b))), ca && ha) return U = 0,
              N.body.style.webkitUserSelect = "none",
              N.selection.getNative()[browser.ie9below ? "empty": "removeAllRanges"](),
              c = f(b),
              m(N, !0, ca, c, e),
              void("h" == ca ? ga.style.left = k(ha, b) + "px": "v" == ca && (ga.style.top = l(ha, b) + "px"));
            if (e) {
              if (N.fireEvent("excludetable", e) === !0) return;
              c = f(b);
              var g = n(e, c),
                i = domUtils.findParentByTagName(e, "table", !0);
              if (j(i, e, b, !0)) {
                if (N.fireEvent("excludetable", i) === !0) return;
                N.body.style.cursor = "url(" + N.options.cursorpath + "h.png),pointer"
              } else if (j(i, e, b)) {
                if (N.fireEvent("excludetable", i) === !0) return;
                N.body.style.cursor = "url(" + N.options.cursorpath + "v.png),pointer"
              } else {
                N.body.style.cursor = "text";
                /\d/.test(g) && (g = g.replace(/\d/, ""), e = Y(e).getPreviewCell(e, "v" == g)),
                  m(N, !!e && !!g, e ? g: "", c, e)
              }
            } else h(!1, i, N)
          } catch(o) {
            a(o)
          }
        }
        function h(a, b, c) {
          if (a) i(b, c);
          else {
            if (fa) return;
            la = setTimeout(function() { ! fa && ea && ea.parentNode && ea.parentNode.removeChild(ea)
              },
              2e3)
          }
        }
        function i(a, b) {
          function c(c, d) {
            clearTimeout(g),
              g = setTimeout(function() {
                  b.fireEvent("tableClicked", a, d)
                },
                300)
          }
          function d(c) {
            clearTimeout(g);
            var d = Y(a),
              e = a.rows[0].cells[0],
              f = d.getLastCell(),
              h = d.getCellsRange(e, f);
            b.selection.getRange().setStart(e, 0).setCursor(!1, !0),
              d.setSelected(h)
          }
          var e = domUtils.getXY(a),
            f = a.ownerDocument;
          if (ea && ea.parentNode) return ea;
          ea = f.createElement("div"),
            ea.contentEditable = !1,
            ea.innerHTML = "",
            ea.style.cssText = "width:15px;height:15px;background-image:url(" + b.options.UEDITOR_HOME_URL + "dialogs/table/dragicon.png);position: absolute;cursor:move;top:" + (e.y - 15) + "px;left:" + e.x + "px;",
            domUtils.unSelectable(ea),
            ea.onmouseover = function(a) {
              fa = !0
            },
            ea.onmouseout = function(a) {
              fa = !1
            },
            domUtils.on(ea, "click",
              function(a, b) {
                c(b, this)
              }),
            domUtils.on(ea, "dblclick",
              function(a, b) {
                d(b)
              }),
            domUtils.on(ea, "dragstart",
              function(a, b) {
                domUtils.preventDefault(b)
              });
          var g;
          f.body.appendChild(ea)
        }
        function j(a, b, c, d) {
          var e = f(c),
            g = n(b, e);
          if (d) {
            var h = a.getElementsByTagName("caption")[0],
              i = h ? h.offsetHeight: 0;
            return "v1" == g && e.y - domUtils.getXY(a).y - i < 8
          }
          return "h1" == g && e.x - domUtils.getXY(a).x < 8
        }
        function k(a, b) {
          var c = Y(a);
          if (c) {
            var d = c.getSameEndPosCells(a, "x")[0],
              e = c.getSameStartPosXCells(a)[0],
              g = f(b).x,
              h = (d ? domUtils.getXY(d).x: domUtils.getXY(c.table).x) + 20,
              i = e ? domUtils.getXY(e).x + e.offsetWidth - 20 : N.body.offsetWidth + 5 || parseInt(domUtils.getComputedStyle(N.body, "width"), 10);
            return h += Q,
              i -= Q,
              g < h ? h: g > i ? i: g
          }
        }
        function l(b, c) {
          try {
            var d = domUtils.getXY(b).y,
              e = f(c).y;
            return e < d ? d: e
          } catch(g) {
            a(g)
          }
        }
        function m(b, c, d, e, f) {
          try {
            b.body.style.cursor = "h" == d ? "col-resize": "v" == d ? "row-resize": "text",
            browser.ie && (!d || ia || Z(b) ? I(b) : (H(b, b.document), J(d, f))),
              da = c
          } catch(g) {
            a(g)
          }
        }
        function n(a, b) {
          var c = domUtils.getXY(a);
          return c ? c.x + a.offsetWidth - b.x < S ? "h": b.x - c.x < S ? "h1": c.y + a.offsetHeight - b.y < S ? "v": b.y - c.y < S ? "v1": "": ""
        }
        function o(a, b) {
          if (!A()) if (V = {
            x: b.clientX,
            y: b.clientY
          },
          2 == b.button) {
            var c = Z(N),
              d = !1;
            if (c) {
              var e = M(N, b);
              utils.each(c.selectedTds,
                function(a) {
                  a === e && (d = !0)
                }),
                d ? (e = c.selectedTds[0], setTimeout(function() {
                    N.selection.getRange().setStart(e, 0).setCursor(!1, !0)
                  },
                  0)) : (_(domUtils.getElementsByTagName(N.body, "th td")), c.clearSelected())
            }
          } else q(b)
        }
        function p(a) {
          U = 0,
            a = a || N.window.event;
          var b = d(a.target || a.srcElement);
          if (b) {
            var c;
            if (c = n(b, f(a))) {
              if (I(N), "h1" == c) if (c = "h", j(domUtils.findParentByTagName(b, "table"), b, a)) N.execCommand("adaptbywindow");
              else if (b = Y(b).getPreviewCell(b)) {
                var e = N.selection.getRange();
                e.selectNodeContents(b).setCursor(!0, !0)
              }
              if ("h" == c) {
                var g = Y(b),
                  h = g.table,
                  i = C(b, h, !0);
                i = s(i, "left"),
                  g.width = g.offsetWidth;
                var k = [],
                  l = [];
                utils.each(i,
                  function(a) {
                    k.push(a.offsetWidth)
                  }),
                  utils.each(i,
                    function(a) {
                      a.removeAttribute("width")
                    }),
                  window.setTimeout(function() {
                      var a = !0;
                      utils.each(i,
                        function(b, c) {
                          var d = b.offsetWidth;
                          return d > k[c] ? (a = !1, !1) : void l.push(d)
                        });
                      var b = a ? l: k;
                      utils.each(i,
                        function(a, c) {
                          a.width = b[c] - G()
                        })
                    },
                    0)
              }
            }
          }
        }
        function q(a) {
          if (_(domUtils.getElementsByTagName(N.body, "td th")), utils.each(N.document.getElementsByTagName("table"),
            function(a) {
              a.ueTable = null
            }), aa = M(N, a)) {
            var b = domUtils.findParentByTagName(aa, "table", !0);
            ut = Y(b),
            ut && ut.clearSelected(),
              da ? r(a) : (N.document.body.style.webkitUserSelect = "", ia = !0, N.addListener("mouseover", x))
          }
        }
        function r(a) {
          browser.ie && (a = u(a)),
            t(),
            R = !0,
            O = setTimeout(function() {
                v(a)
              },
              W)
        }
        function s(a, b) {
          for (var c = [], d = null, e = 0, f = a.length; e < f; e++) d = a[e][b],
          d && c.push(d);
          return c
        }
        function t() {
          O && clearTimeout(O),
            O = null
        }
        function u(a) {
          var b = ["pageX", "pageY", "clientX", "clientY", "srcElement", "target"],
            c = {};
          if (a) for (var d, e, f = 0; d = b[f]; f++) e = a[d],
          e && (c[d] = e);
          return c
        }
        function v(a) {
          if (R = !1, aa = a.target || a.srcElement) {
            var b = n(aa, f(a));
            /\d/.test(b) && (b = b.replace(/\d/, ""), aa = Y(aa).getPreviewCell(aa, "v" == b)),
              I(N),
              H(N, N.document),
              N.fireEvent("saveScene"),
              J(b, aa),
              ia = !0,
              ca = b,
              ha = aa
          }
        }
        function w(a, b) {
          if (!A()) {
            if (t(), R = !1, da && (U = ++U % 3, V = {
              x: b.clientX,
              y: b.clientY
            },
              P = setTimeout(function() {
                  U > 0 && U--
                },
                W), 2 === U)) return U = 0,
              void p(b);
            if (2 != b.button) {
              var c = this,
                d = c.selection.getRange(),
                e = domUtils.findParentByTagName(d.startContainer, "table", !0),
                f = domUtils.findParentByTagName(d.endContainer, "table", !0);
              if ((e || f) && (e === f ? (e = domUtils.findParentByTagName(d.startContainer, ["td", "th", "caption"], !0), f = domUtils.findParentByTagName(d.endContainer, ["td", "th", "caption"], !0), e !== f && c.selection.clearRange()) : c.selection.clearRange()), ia = !1, c.document.body.style.webkitUserSelect = "", ca && ha && (c.selection.getNative()[browser.ie9below ? "empty": "removeAllRanges"](), U = 0, ga = c.document.getElementById("ue_tableDragLine"))) {
                var g = domUtils.getXY(ha),
                  h = domUtils.getXY(ga);
                switch (ca) {
                  case "h":
                    z(ha, h.x - g.x);
                    break;
                  case "v":
                    B(ha, h.y - g.y - ha.offsetHeight)
                }
                return ca = "",
                  ha = null,
                  I(c),
                  void c.fireEvent("saveScene")
              }
              if (aa) {
                var i = Y(aa),
                  j = i ? i.selectedTds[0] : null;
                if (j) d = new dom.Range(c.document),
                  domUtils.isEmptyBlock(j) ? d.setStart(j, 0).setCursor(!1, !0) : d.selectNodeContents(j).shrinkBoundary().setCursor(!1, !0);
                else if (d = c.selection.getRange().shrinkBoundary(), !d.collapsed) {
                  var e = domUtils.findParentByTagName(d.startContainer, ["td", "th"], !0),
                    f = domUtils.findParentByTagName(d.endContainer, ["td", "th"], !0); (e && !f || !e && f || e && f && e !== f) && d.setCursor(!1, !0)
                }
                aa = null,
                  c.removeListener("mouseover", x)
              } else {
                var k = domUtils.findParentByTagName(b.target || b.srcElement, "td", !0);
                if (k || (k = domUtils.findParentByTagName(b.target || b.srcElement, "th", !0)), k && ("TD" == k.tagName || "TH" == k.tagName)) {
                  if (c.fireEvent("excludetable", k) === !0) return;
                  d = new dom.Range(c.document),
                    d.setStart(k, 0).setCursor(!1, !0)
                }
              }
              c._selectionChange(250, b)
            }
          }
        }
        function x(a, b) {
          if (!A()) {
            var c = this,
              d = b.target || b.srcElement;
            if (ba = domUtils.findParentByTagName(d, "td", !0) || domUtils.findParentByTagName(d, "th", !0), aa && ba && ("TD" == aa.tagName && "TD" == ba.tagName || "TH" == aa.tagName && "TH" == ba.tagName) && domUtils.findParentByTagName(aa, "table") == domUtils.findParentByTagName(ba, "table")) {
              var e = Y(ba);
              if (aa != ba) {
                c.document.body.style.webkitUserSelect = "none",
                  c.selection.getNative()[browser.ie9below ? "empty": "removeAllRanges"]();
                var f = e.getCellsRange(aa, ba);
                e.setSelected(f)
              } else c.document.body.style.webkitUserSelect = "",
                e.clearSelected()
            }
            b.preventDefault ? b.preventDefault() : b.returnValue = !1
          }
        }
        function y(a, b, c) {
          var d = parseInt(domUtils.getComputedStyle(a, "line-height"), 10),
            e = c + b;
          b = e < d ? d: e,
          a.style.height && (a.style.height = ""),
            1 == a.rowSpan ? a.setAttribute("height", b) : a.removeAttribute && a.removeAttribute("height")
        }
        function z(a, b) {
          var c = Y(a);
          if (c) {
            var d = c.table,
              e = C(a, d);
            if (d.style.width = "", d.removeAttribute("width"), b = D(b, a, e), a.nextSibling) {
              utils.each(e,
                function(a) {
                  a.left.width = +a.left.width + b,
                  a.right && (a.right.width = +a.right.width - b)
                })
            } else utils.each(e,
              function(a) {
                a.left.width -= -b
              })
          }
        }
        function A() {
          return "false" === N.body.contentEditable
        }
        function B(a, b) {
          if (! (Math.abs(b) < 10)) {
            var c = Y(a);
            if (c) for (var d, e = c.getSameEndPosCells(a, "y"), f = e[0] ? e[0].offsetHeight: 0, g = 0; d = e[g++];) y(d, b, f)
          }
        }
        function C(a, b, c) {
          if (b || (b = domUtils.findParentByTagName(a, "table")), !b) return null;
          for (var d = (domUtils.getNodeIndex(a), a), e = b.rows, f = 0; d;) 1 === d.nodeType && (f += d.colSpan || 1),
            d = d.previousSibling;
          d = null;
          var g = [];
          return utils.each(e,
            function(a) {
              var b = a.cells,
                d = 0;
              utils.each(b,
                function(a) {
                  return d += a.colSpan || 1,
                    d === f ? (g.push({
                      left: a,
                      right: a.nextSibling || null
                    }), !1) : d > f ? (c && g.push({
                      left: a
                    }), !1) : void 0
                })
            }),
            g
        }
        function D(a, b, c) {
          if (a -= G(), a < 0) return 0;
          a -= E(b);
          var d = a < 0 ? "left": "right";
          return a = Math.abs(a),
            utils.each(c,
              function(b) {
                var c = b[d];
                c && (a = Math.min(a, E(c) - Q))
              }),
            a = a < 0 ? 0 : a,
            "left" === d ? -a: a
        }
        function E(a) {
          var b = 0,
            b = a.offsetWidth - G();
          a.nextSibling || (b -= F(a)),
            b = b < 0 ? 0 : b;
          try {
            a.width = b
          } catch(c) {}
          return b
        }
        function F(a) {
          if (tab = domUtils.findParentByTagName(a, "table", !1), void 0 === tab.offsetVal) {
            var b = a.previousSibling;
            b ? tab.offsetVal = a.offsetWidth - b.offsetWidth === X.borderWidth ? X.borderWidth: 0 : tab.offsetVal = 0
          }
          return tab.offsetVal
        }
        function G() {
          if (void 0 === X.tabcellSpace) {
            var a = N.document.createElement("table"),
              b = N.document.createElement("tbody"),
              c = N.document.createElement("tr"),
              d = N.document.createElement("td"),
              e = null;
            d.style.cssText = "border: 0;",
              d.width = 1,
              c.appendChild(d),
              c.appendChild(e = d.cloneNode(!1)),
              b.appendChild(c),
              a.appendChild(b),
              a.style.cssText = "visibility: hidden;",
              N.body.appendChild(a),
              X.paddingSpace = d.offsetWidth - 1;
            var f = a.offsetWidth;
            d.style.cssText = "",
              e.style.cssText = "",
              X.borderWidth = (a.offsetWidth - f) / 3,
              X.tabcellSpace = X.paddingSpace + X.borderWidth,
              N.body.removeChild(a)
          }
          return G = function() {
            return X.tabcellSpace
          },
            X.tabcellSpace
        }
        function H(a, b) {
          ia || (ga = a.document.createElement("div"), domUtils.setAttributes(ga, {
            id: "ue_tableDragLine",
            unselectable: "on",
            contenteditable: !1,
            onresizestart: "return false",
            ondragstart: "return false",
            onselectstart: "return false",
            style: "background-color:blue;position:absolute;padding:0;margin:0;background-image:none;border:0px none;opacity:0;filter:alpha(opacity=0)"
          }), a.body.appendChild(ga))
        }
        function I(a) {
          if (!ia) for (var b; b = a.document.getElementById("ue_tableDragLine");) domUtils.remove(b)
        }
        function J(a, b) {
          if (b) {
            var c, d = domUtils.findParentByTagName(b, "table"),
              e = d.getElementsByTagName("caption"),
              f = d.offsetWidth,
              g = d.offsetHeight - (e.length > 0 ? e[0].offsetHeight: 0),
              h = domUtils.getXY(d),
              i = domUtils.getXY(b);
            switch (a) {
              case "h":
                c = "height:" + g + "px;top:" + (h.y + (e.length > 0 ? e[0].offsetHeight: 0)) + "px;left:" + (i.x + b.offsetWidth),
                  ga.style.cssText = c + "px;position: absolute;display:block;background-color:blue;width:1px;border:0; color:blue;opacity:.3;filter:alpha(opacity=30)";
                break;
              case "v":
                c = "width:" + f + "px;left:" + h.x + "px;top:" + (i.y + b.offsetHeight),
                  ga.style.cssText = c + "px;overflow:hidden;position: absolute;display:block;background-color:blue;height:1px;border:0;color:blue;opacity:.2;filter:alpha(opacity=20)"
            }
          }
        }
        function K(a, b) {
          for (var c, d, e = domUtils.getElementsByTagName(a.body, "table"), f = 0; d = e[f++];) {
            var g = domUtils.getElementsByTagName(d, "td");
            g[0] && (b ? (c = g[0].style.borderColor.replace(/\s/g, ""), /(#ffffff)|(rgb\(255,255,255\))/gi.test(c) && domUtils.addClass(d, "noBorderTable")) : domUtils.removeClasses(d, "noBorderTable"))
          }
        }
        function L(a, b, c) {
          var d = a.body;
          return d.offsetWidth - (b ? 2 * parseInt(domUtils.getComputedStyle(d, "margin-left"), 10) : 0) - 2 * c.tableBorder - (a.options.offsetWidth || 0)
        }
        function M(a, b) {
          var c = domUtils.findParentByTagName(b.target || b.srcElement, ["td", "th"], !0),
            d = null;
          if (!c) return null;
          if (d = n(c, f(b)), !c) return null;
          if ("h1" === d && c.previousSibling) {
            var e = domUtils.getXY(c),
              g = c.offsetWidth;
            Math.abs(e.x + g - b.clientX) > g / 3 && (c = c.previousSibling)
          } else if ("v1" === d && c.parentNode.previousSibling) {
            var e = domUtils.getXY(c),
              h = c.offsetHeight;
            Math.abs(e.y + h - b.clientY) > h / 3 && (c = c.parentNode.previousSibling.firstChild)
          }
          return c && a.fireEvent("excludetable", c) !== !0 ? c: null
        }
        var N = this,
          O = null,
          P = null,
          Q = 5,
          R = !1,
          S = 5,
          T = 10,
          U = 0,
          V = null,
          W = 360,
          X = UE.UETable,
          Y = function(a) {
            return X.getUETable(a)
          },
          Z = function(a) {
            return X.getUETableBySelected(a)
          },
          $ = function(a, b) {
            return X.getDefaultValue(a, b)
          },
          _ = function(a) {
            return X.removeSelectedClass(a)
          };
        N.ready(function() {
          var a = this,
            b = a.selection.getText;
          a.selection.getText = function() {
            var c = Z(a);
            if (c) {
              var d = "";
              return utils.each(c.selectedTds,
                function(a) {
                  d += a[browser.ie ? "innerText": "textContent"]
                }),
                d
            }
            return b.call(a.selection)
          }
        });
        var aa = null,
          ba = null,
          ca = "",
          da = !1,
          ea = null,
          fa = !1,
          ga = null,
          ha = null,
          ia = !1,
          ja = !0;
        N.setOpt({
          maxColNum: 20,
          maxRowNum: 100,
          defaultCols: 5,
          defaultRows: 5,
          tdvalign: "top",
          cursorpath: N.options.UEDITOR_HOME_URL + "themes/default/images/cursor_",
          tableDragable: !1,
          classList: ["ue-table-interlace-color-single", "ue-table-interlace-color-double"]
        }),
          N.getUETable = Y;
        var ka = {
          deletetable: 1,
          inserttable: 1,
          cellvalign: 1,
          insertcaption: 1,
          deletecaption: 1,
          inserttitle: 1,
          deletetitle: 1,
          mergeright: 1,
          mergedown: 1,
          mergecells: 1,
          insertrow: 1,
          insertrownext: 1,
          deleterow: 1,
          insertcol: 1,
          insertcolnext: 1,
          deletecol: 1,
          splittocells: 1,
          splittorows: 1,
          splittocols: 1,
          adaptbytext: 1,
          adaptbywindow: 1,
          adaptbycustomer: 1,
          insertparagraph: 1,
          insertparagraphbeforetable: 1,
          averagedistributecol: 1,
          averagedistributerow: 1
        };
        N.ready(function() {
          utils.cssRule("table", ".selectTdClass{background-color:#edf5fa !important}table.noBorderTable td,table.noBorderTable th,table.noBorderTable caption{border:1px dashed #ddd !important}table{margin-bottom:10px;border-collapse:collapse;display:table;}td,th{padding: 5px 10px;border: 1px solid #DDD;}caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}th{border-top:1px solid #BBB;background-color:#F7F7F7;}table tr.firstRow th{border-top-width:2px;}.ue-table-interlace-color-single{ background-color: #fcfcfc; } .ue-table-interlace-color-double{ background-color: #f7faff; }td p{margin:0;padding:0;}", N.document);
          var a, c, f;
          N.addListener("keydown",
            function(b, d) {
              var g = this,
                h = d.keyCode || d.which;
              if (8 == h) {
                var i = Z(g);
                i && i.selectedTds.length && (i.isFullCol() ? g.execCommand("deletecol") : i.isFullRow() ? g.execCommand("deleterow") : g.fireEvent("delcells"), domUtils.preventDefault(d));
                var j = domUtils.findParentByTagName(g.selection.getStart(), "caption", !0),
                  k = g.selection.getRange();
                if (k.collapsed && j && e(j)) {
                  g.fireEvent("saveScene");
                  var l = j.parentNode;
                  domUtils.remove(j),
                  l && k.setStart(l.rows[0].cells[0], 0).setCursor(!1, !0),
                    g.fireEvent("saveScene")
                }
              }
              if (46 == h && (i = Z(g))) {
                g.fireEvent("saveScene");
                for (var m, n = 0; m = i.selectedTds[n++];) domUtils.fillNode(g.document, m);
                g.fireEvent("saveScene"),
                  domUtils.preventDefault(d)
              }
              if (13 == h) {
                var o = g.selection.getRange(),
                  j = domUtils.findParentByTagName(o.startContainer, "caption", !0);
                if (j) {
                  var l = domUtils.findParentByTagName(j, "table");
                  return o.collapsed ? j && o.setStart(l.rows[0].cells[0], 0).setCursor(!1, !0) : (o.deleteContents(), g.fireEvent("saveScene")),
                    void domUtils.preventDefault(d)
                }
                if (o.collapsed) {
                  var l = domUtils.findParentByTagName(o.startContainer, "table");
                  if (l) {
                    var p = l.rows[0].cells[0],
                      q = domUtils.findParentByTagName(g.selection.getStart(), ["td", "th"], !0),
                      r = l.previousSibling;
                    if (p === q && (!r || 1 == r.nodeType && "TABLE" == r.tagName) && domUtils.isStartInblock(o)) {
                      var s = domUtils.findParent(g.selection.getStart(),
                        function(a) {
                          return domUtils.isBlockElm(a)
                        },
                        !0);
                      s && (/t(h|d)/i.test(s.tagName) || s === q.firstChild) && (g.execCommand("insertparagraphbeforetable"), domUtils.preventDefault(d))
                    }
                  }
                }
              }
              if ((d.ctrlKey || d.metaKey) && "67" == d.keyCode) {
                a = null;
                var i = Z(g);
                if (i) {
                  var t = i.selectedTds;
                  c = i.isFullCol(),
                    f = i.isFullRow(),
                    a = [[i.cloneCell(t[0], null, !0)]];
                  for (var m, n = 1; m = t[n]; n++) m.parentNode !== t[n - 1].parentNode ? a.push([i.cloneCell(m, null, !0)]) : a[a.length - 1].push(i.cloneCell(m, null, !0))
                }
              }
            }),
            N.addListener("tablehasdeleted",
              function() {
                m(this, !1, "", null),
                ea && domUtils.remove(ea)
              }),
            N.addListener("beforepaste",
              function(d, g) {
                var h = this,
                  i = h.selection.getRange();
                if (domUtils.findParentByTagName(i.startContainer, "caption", !0)) {
                  var j = h.document.createElement("div");
                  return j.innerHTML = g.html,
                    void(g.html = j[browser.ie9below ? "innerText": "textContent"])
                }
                var k = Z(h);
                if (a) {
                  h.fireEvent("saveScene");
                  var l, m, i = h.selection.getRange(),
                    n = domUtils.findParentByTagName(i.startContainer, ["td", "th"], !0);
                  if (n) {
                    var o = Y(n);
                    if (f) {
                      var p = o.getCellInfo(n).rowIndex;
                      "TH" == n.tagName && p++;
                      for (var q, r = 0; q = a[r++];) {
                        for (var s, t = o.insertRow(p++, "td"), u = 0; s = q[u]; u++) {
                          var v = t.cells[u];
                          v || (v = t.insertCell(u)),
                            v.innerHTML = s.innerHTML,
                          s.getAttribute("width") && v.setAttribute("width", s.getAttribute("width")),
                          s.getAttribute("vAlign") && v.setAttribute("vAlign", s.getAttribute("vAlign")),
                          s.getAttribute("align") && v.setAttribute("align", s.getAttribute("align")),
                          s.style.cssText && (v.style.cssText = s.style.cssText)
                        }
                        for (var s, u = 0; (s = t.cells[u]) && q[u]; u++) s.innerHTML = q[u].innerHTML,
                        q[u].getAttribute("width") && s.setAttribute("width", q[u].getAttribute("width")),
                        q[u].getAttribute("vAlign") && s.setAttribute("vAlign", q[u].getAttribute("vAlign")),
                        q[u].getAttribute("align") && s.setAttribute("align", q[u].getAttribute("align")),
                        q[u].style.cssText && (s.style.cssText = q[u].style.cssText)
                      }
                    } else {
                      if (c) {
                        y = o.getCellInfo(n);
                        for (var s, w = 0,
                               u = 0,
                               q = a[0]; s = q[u++];) w += s.colSpan || 1;
                        for (h.__hasEnterExecCommand = !0, r = 0; r < w; r++) h.execCommand("insertcol");
                        h.__hasEnterExecCommand = !1,
                          n = o.table.rows[0].cells[y.cellIndex],
                        "TH" == n.tagName && (n = o.table.rows[1].cells[y.cellIndex])
                      }
                      for (var q, r = 0; q = a[r++];) {
                        l = n;
                        for (var s, u = 0; s = q[u++];) if (n) n.innerHTML = s.innerHTML,
                        s.getAttribute("width") && n.setAttribute("width", s.getAttribute("width")),
                        s.getAttribute("vAlign") && n.setAttribute("vAlign", s.getAttribute("vAlign")),
                        s.getAttribute("align") && n.setAttribute("align", s.getAttribute("align")),
                        s.style.cssText && (n.style.cssText = s.style.cssText),
                          m = n,
                          n = n.nextSibling;
                        else {
                          var x = s.cloneNode(!0);
                          domUtils.removeAttributes(x, ["class", "rowSpan", "colSpan"]),
                            m.parentNode.appendChild(x)
                        }
                        if (n = o.getNextCell(l, !0, !0), !a[r]) break;
                        if (!n) {
                          var y = o.getCellInfo(l);
                          o.table.insertRow(o.table.rows.length),
                            o.update(),
                            n = o.getVSideCell(l, !0)
                        }
                      }
                    }
                    o.update()
                  } else {
                    k = h.document.createElement("table");
                    for (var q, r = 0; q = a[r++];) {
                      for (var s, t = k.insertRow(k.rows.length), u = 0; s = q[u++];) x = X.cloneCell(s, null, !0),
                        domUtils.removeAttributes(x, ["class"]),
                        t.appendChild(x);
                      2 == u && x.rowSpan > 1 && (x.rowSpan = 1)
                    }
                    var z = $(h),
                      A = h.body.offsetWidth - (ja ? 2 * parseInt(domUtils.getComputedStyle(h.body, "margin-left"), 10) : 0) - 2 * z.tableBorder - (h.options.offsetWidth || 0);
                    h.execCommand("insertHTML", "<table  " + (c && f ? 'width="' + A + '"': "") + ">" + k.innerHTML.replace(/>\s*</g, "><").replace(/\bth\b/gi, "td") + "</table>")
                  }
                  return h.fireEvent("contentchange"),
                    h.fireEvent("saveScene"),
                    g.html = "",
                    !0
                }
                var B, j = h.document.createElement("div");
                j.innerHTML = g.html,
                  B = j.getElementsByTagName("table"),
                  domUtils.findParentByTagName(h.selection.getStart(), "table") ? (utils.each(B,
                    function(a) {
                      domUtils.remove(a)
                    }), domUtils.findParentByTagName(h.selection.getStart(), "caption", !0) && (j.innerHTML = j[browser.ie ? "innerText": "textContent"])) : utils.each(B,
                    function(a) {
                      b(a, !0),
                        domUtils.removeAttributes(a, ["style", "border"]),
                        utils.each(domUtils.getElementsByTagName(a, "td"),
                          function(a) {
                            e(a) && domUtils.fillNode(h.document, a),
                              b(a, !0)
                          })
                    }),
                  g.html = j.innerHTML
              }),
            N.addListener("afterpaste",
              function() {
                utils.each(domUtils.getElementsByTagName(N.body, "table"),
                  function(a) {
                    if (a.offsetWidth > N.body.offsetWidth) {
                      var b = $(N, a);
                      a.style.width = N.body.offsetWidth - (ja ? 2 * parseInt(domUtils.getComputedStyle(N.body, "margin-left"), 10) : 0) - 2 * b.tableBorder - (N.options.offsetWidth || 0) + "px"
                    }
                  })
              }),
            N.addListener("blur",
              function() {
                a = null
              });
          var i;
          N.addListener("keydown",
            function() {
              clearTimeout(i),
                i = setTimeout(function() {
                    var a = N.selection.getRange(),
                      b = domUtils.findParentByTagName(a.startContainer, ["th", "td"], !0);
                    if (b) {
                      var c = b.parentNode.parentNode.parentNode;
                      c.offsetWidth > c.getAttribute("width") && (b.style.wordBreak = "break-all")
                    }
                  },
                  100)
            }),
            N.addListener("selectionchange",
              function() {
                m(N, !1, "", null)
              }),
            N.addListener("contentchange",
              function() {
                var a = this;
                if (I(a), !Z(a)) {
                  var b = a.selection.getRange(),
                    c = b.startContainer;
                  c = domUtils.findParentByTagName(c, ["td", "th"], !0),
                    utils.each(domUtils.getElementsByTagName(a.document, "table"),
                      function(b) {
                        a.fireEvent("excludetable", b) !== !0 && (b.ueTable = new X(b), b.onmouseover = function() {
                          a.fireEvent("tablemouseover", b)
                        },
                          b.onmousemove = function() {
                            a.fireEvent("tablemousemove", b),
                            a.options.tableDragable && h(!0, this, a),
                              utils.defer(function() {
                                  a.fireEvent("contentchange", 50)
                                },
                                !0)
                          },
                          b.onmouseout = function() {
                            a.fireEvent("tablemouseout", b),
                              m(a, !1, "", null),
                              I(a)
                          },
                          b.onclick = function(b) {
                            b = a.window.event || b;
                            var c = d(b.target || b.srcElement);
                            if (c) {
                              var e, f = Y(c),
                                g = f.table,
                                h = f.getCellInfo(c),
                                i = a.selection.getRange();
                              if (j(g, c, b, !0)) {
                                var k = f.getCell(f.indexTable[f.rowsNum - 1][h.colIndex].rowIndex, f.indexTable[f.rowsNum - 1][h.colIndex].cellIndex);
                                return void(b.shiftKey && f.selectedTds.length ? f.selectedTds[0] !== k ? (e = f.getCellsRange(f.selectedTds[0], k), f.setSelected(e)) : i && i.selectNodeContents(k).select() : c !== k ? (e = f.getCellsRange(c, k), f.setSelected(e)) : i && i.selectNodeContents(k).select())
                              }
                              if (j(g, c, b)) {
                                var l = f.getCell(f.indexTable[h.rowIndex][f.colsNum - 1].rowIndex, f.indexTable[h.rowIndex][f.colsNum - 1].cellIndex);
                                b.shiftKey && f.selectedTds.length ? f.selectedTds[0] !== l ? (e = f.getCellsRange(f.selectedTds[0], l), f.setSelected(e)) : i && i.selectNodeContents(l).select() : c !== l ? (e = f.getCellsRange(c, l), f.setSelected(e)) : i && i.selectNodeContents(l).select()
                              }
                            }
                          })
                      }),
                    K(a, !0)
                }
              }),
            domUtils.on(N.document, "mousemove", g),
            domUtils.on(N.document, "mouseout",
              function(a) {
                var b = a.target || a.srcElement;
                "TABLE" == b.tagName && m(N, !1, "", null)
              }),
            N.addListener("interlacetable",
              function(a, b, c) {
                if (b) for (var d = this,
                              e = b.rows,
                              f = e.length,
                              g = function(a, b, c) {
                                return a[b] ? a[b] : c ? a[b % a.length] : ""
                              },
                              h = 0; h < f; h++) e[h].className = g(c || d.options.classList, h, !0)
              }),
            N.addListener("uninterlacetable",
              function(a, b) {
                if (b) for (var c = this,
                              d = b.rows,
                              e = c.options.classList,
                              f = d.length,
                              g = 0; g < f; g++) domUtils.removeClasses(d[g], e)
              }),
            N.addListener("mousedown", o),
            N.addListener("mouseup", w),
            domUtils.on(N.body, "dragstart",
              function(a) {
                w.call(N, "dragstart", a)
              }),
            N.addOutputRule(function(a) {
              utils.each(a.getNodesByTagName("div"),
                function(a) {
                  "ue_tableDragLine" == a.getAttr("id") && a.parentNode.removeChild(a)
                })
            });
          var k = 0;
          N.addListener("mousedown",
            function() {
              k = 0
            }),
            N.addListener("tabkeydown",
              function() {
                var a = this.selection.getRange(),
                  b = a.getCommonAncestor(!0, !0),
                  c = domUtils.findParentByTagName(b, "table");
                if (c) {
                  if (domUtils.findParentByTagName(b, "caption", !0)) {
                    var d = domUtils.getElementsByTagName(c, "th td");
                    d && d.length && a.setStart(d[0], 0).setCursor(!1, !0)
                  } else {
                    var d = domUtils.findParentByTagName(b, ["td", "th"], !0),
                      f = Y(d);
                    k = d.rowSpan > 1 ? k: f.getCellInfo(d).rowIndex;
                    var g = f.getTabNextCell(d, k);
                    g ? e(g) ? a.setStart(g, 0).setCursor(!1, !0) : a.selectNodeContents(g).select() : (N.fireEvent("saveScene"), N.__hasEnterExecCommand = !0, this.execCommand("insertrownext"), N.__hasEnterExecCommand = !1, a = this.selection.getRange(), a.setStart(c.rows[c.rows.length - 1].cells[0], 0).setCursor(), N.fireEvent("saveScene"))
                  }
                  return ! 0
                }
              }),
          browser.ie && N.addListener("selectionchange",
            function() {
              m(this, !1, "", null)
            }),
            N.addListener("keydown",
              function(a, b) {
                var c = this,
                  d = b.keyCode || b.which;
                if (8 != d && 46 != d) {
                  var e = !(b.ctrlKey || b.metaKey || b.shiftKey || b.altKey);
                  e && _(domUtils.getElementsByTagName(c.body, "td"));
                  var f = Z(c);
                  f && e && f.clearSelected()
                }
              }),
            N.addListener("beforegetcontent",
              function() {
                K(this, !1),
                browser.ie && utils.each(this.document.getElementsByTagName("caption"),
                  function(a) {
                    domUtils.isEmptyNode(a) && (a.innerHTML = "&nbsp;")
                  })
              }),
            N.addListener("aftergetcontent",
              function() {
                K(this, !0)
              }),
            N.addListener("getAllHtml",
              function() {
                _(N.document.getElementsByTagName("td"))
              }),
            N.addListener("fullscreenchanged",
              function(a, b) {
                if (!b) {
                  var c = this.body.offsetWidth / document.body.offsetWidth,
                    d = domUtils.getElementsByTagName(this.body, "table");
                  utils.each(d,
                    function(a) {
                      if (a.offsetWidth < N.body.offsetWidth) return ! 1;
                      var b = domUtils.getElementsByTagName(a, "td"),
                        d = [];
                      utils.each(b,
                        function(a) {
                          d.push(a.offsetWidth)
                        });
                      for (var e, f = 0; e = b[f]; f++) e.setAttribute("width", Math.floor(d[f] * c));
                      a.setAttribute("width", Math.floor(L(N, ja, $(N))))
                    })
                }
              });
          var l = N.execCommand;
          N.execCommand = function(a, b) {
            var c = this;
            a = a.toLowerCase();
            var d, f, g = Z(c),
              h = new dom.Range(c.document),
              i = c.commands[a] || UE.commands[a];
            if (i) {
              if (!g || ka[a] || i.notNeedUndo || c.__hasEnterExecCommand) f = l.apply(c, arguments);
              else {
                c.__hasEnterExecCommand = !0,
                  c.fireEvent("beforeexeccommand", a),
                  d = g.selectedTds;
                for (var j, k, m, n = -2,
                       o = -2,
                       p = 0; m = d[p]; p++) e(m) ? h.setStart(m, 0).setCursor(!1, !0) : h.selectNode(m).select(!0),
                  k = c.queryCommandState(a),
                  j = c.queryCommandValue(a),
                k != -1 && (n === k && o === j || (c._ignoreContentChange = !0, f = l.apply(c, arguments), c._ignoreContentChange = !1), n = c.queryCommandState(a), o = c.queryCommandValue(a), domUtils.isEmptyBlock(m) && domUtils.fillNode(c.document, m));
                h.setStart(d[0], 0).shrinkBoundary(!0).setCursor(!1, !0),
                  c.fireEvent("contentchange"),
                  c.fireEvent("afterexeccommand", a),
                  c.__hasEnterExecCommand = !1,
                  c._selectionChange()
              }
              return f
            }
          }
        });
        var la
      }, UE.UETable.prototype.sortTable = function(a, b) {
      var c = this.table,
        d = c.rows,
        e = [],
        f = "TH" === d[0].cells[0].tagName,
        g = 0;
      if (this.selectedTds.length) {
        for (var h = this.cellsRange,
               i = h.endRowIndex + 1,
               j = h.beginRowIndex; j < i; j++) e[j] = d[j];
        e.splice(0, h.beginRowIndex),
          g = h.endRowIndex + 1 === this.rowsNum ? 0 : h.endRowIndex + 1;
      } else for (var j = 0,
                    i = d.length; j < i; j++) e[j] = d[j];
      var k = {
        reversecurrent: function(a, b) {
          return 1
        },
        orderbyasc: function(a, b) {
          var c = a.innerText || a.textContent,
            d = b.innerText || b.textContent;
          return c.localeCompare(d)
        },
        reversebyasc: function(a, b) {
          var c = a.innerHTML,
            d = b.innerHTML;
          return d.localeCompare(c)
        },
        orderbynum: function(a, b) {
          var c = a[browser.ie ? "innerText": "textContent"].match(/\d+/),
            d = b[browser.ie ? "innerText": "textContent"].match(/\d+/);
          return c && (c = +c[0]),
          d && (d = +d[0]),
          (c || 0) - (d || 0)
        },
        reversebynum: function(a, b) {
          var c = a[browser.ie ? "innerText": "textContent"].match(/\d+/),
            d = b[browser.ie ? "innerText": "textContent"].match(/\d+/);
          return c && (c = +c[0]),
          d && (d = +d[0]),
          (d || 0) - (c || 0)
        }
      };
      c.setAttribute("data-sort-type", b && "string" == typeof b && k[b] ? b: ""),
      f && e.splice(0, 1),
        e = utils.sort(e,
          function(c, d) {
            var e;
            return e = b && "function" == typeof b ? b.call(this, c.cells[a], d.cells[a]) : b && "number" == typeof b ? 1 : b && "string" == typeof b && k[b] ? k[b].call(this, c.cells[a], d.cells[a]) : k.orderbyasc.call(this, c.cells[a], d.cells[a])
          });
      for (var l = c.ownerDocument.createDocumentFragment(), m = 0, i = e.length; m < i; m++) l.appendChild(e[m]);
      var n = c.getElementsByTagName("tbody")[0];
      g ? n.insertBefore(l, d[g - h.endRowIndex + h.beginRowIndex - 1]) : n.appendChild(l)
    },
      UE.plugins.tablesort = function() {
        var a = this,
          b = UE.UETable,
          c = function(a) {
            return b.getUETable(a)
          },
          d = function(a) {
            return b.getTableItemsByRange(a)
          };
        a.ready(function() {
          utils.cssRule("tablesort", "table.sortEnabled tr.firstRow th,table.sortEnabled tr.firstRow td{padding-right:20px;background-repeat: no-repeat;background-position: center right;   background-image:url(" + a.options.themePath + a.options.theme + "/images/sortable.png);}", a.document),
            a.addListener("afterexeccommand",
              function(a, b) {
                "mergeright" != b && "mergedown" != b && "mergecells" != b || this.execCommand("disablesort")
              })
        }),
          UE.commands.sorttable = {
            queryCommandState: function() {
              var a = this,
                b = d(a);
              if (!b.cell) return - 1;
              for (var c, e = b.table,
                     f = e.getElementsByTagName("td"), g = 0; c = f[g++];) if (1 != c.rowSpan || 1 != c.colSpan) return - 1;
              return 0
            },
            execCommand: function(a, b) {
              var e = this,
                f = e.selection.getRange(),
                g = f.createBookmark(!0),
                h = d(e),
                i = h.cell,
                j = c(h.table),
                k = j.getCellInfo(i);
              j.sortTable(k.cellIndex, b),
                f.moveToBookmark(g);
              try {
                f.select()
              } catch(l) {}
            }
          },
          UE.commands.enablesort = UE.commands.disablesort = {
            queryCommandState: function(a) {
              var b = d(this).table;
              if (b && "enablesort" == a) for (var c = domUtils.getElementsByTagName(b, "th td"), e = 0; e < c.length; e++) if (c[e].getAttribute("colspan") > 1 || c[e].getAttribute("rowspan") > 1) return - 1;
              return b ? "enablesort" == a ^ "sortEnabled" != b.getAttribute("data-sort") ? -1 : 0 : -1
            },
            execCommand: function(a) {
              var b = d(this).table;
              b.setAttribute("data-sort", "enablesort" == a ? "sortEnabled": "sortDisabled"),
                "enablesort" == a ? domUtils.addClass(b, "sortEnabled") : domUtils.removeClasses(b, "sortEnabled")
            }
          }
      },
      UE.plugins.contextmenu = function() {
        var a = this;
        if (a.setOpt("enableContextMenu", !0), a.getOpt("enableContextMenu") !== !1) {
          var b, c = a.getLang("contextMenu"),
            d = a.options.contextMenu || [{
              label: c.selectall,
              cmdName: "selectall"
            },
              {
                label: c.cleardoc,
                cmdName: "cleardoc",
                exec: function() {
                  confirm(c.confirmclear) && this.execCommand("cleardoc")
                }
              },
              "-", {
                label: c.unlink,
                cmdName: "unlink"
              },
              "-", {
                group: c.paragraph,
                icon: "justifyjustify",
                subMenu: [{
                  label: c.justifyleft,
                  cmdName: "justify",
                  value: "left"
                },
                  {
                    label: c.justifyright,
                    cmdName: "justify",
                    value: "right"
                  },
                  {
                    label: c.justifycenter,
                    cmdName: "justify",
                    value: "center"
                  },
                  {
                    label: c.justifyjustify,
                    cmdName: "justify",
                    value: "justify"
                  }]
              },
              "-", {
                group: c.table,
                icon: "table",
                subMenu: [{
                  label: c.inserttable,
                  cmdName: "inserttable"
                },
                  {
                    label: c.deletetable,
                    cmdName: "deletetable"
                  },
                  "-", {
                    label: c.deleterow,
                    cmdName: "deleterow"
                  },
                  {
                    label: c.deletecol,
                    cmdName: "deletecol"
                  },
                  {
                    label: c.insertcol,
                    cmdName: "insertcol"
                  },
                  {
                    label: c.insertcolnext,
                    cmdName: "insertcolnext"
                  },
                  {
                    label: c.insertrow,
                    cmdName: "insertrow"
                  },
                  {
                    label: c.insertrownext,
                    cmdName: "insertrownext"
                  },
                  "-", {
                    label: c.insertcaption,
                    cmdName: "insertcaption"
                  },
                  {
                    label: c.deletecaption,
                    cmdName: "deletecaption"
                  },
                  {
                    label: c.inserttitle,
                    cmdName: "inserttitle"
                  },
                  {
                    label: c.deletetitle,
                    cmdName: "deletetitle"
                  },
                  {
                    label: c.inserttitlecol,
                    cmdName: "inserttitlecol"
                  },
                  {
                    label: c.deletetitlecol,
                    cmdName: "deletetitlecol"
                  },
                  "-", {
                    label: c.mergecells,
                    cmdName: "mergecells"
                  },
                  {
                    label: c.mergeright,
                    cmdName: "mergeright"
                  },
                  {
                    label: c.mergedown,
                    cmdName: "mergedown"
                  },
                  "-", {
                    label: c.splittorows,
                    cmdName: "splittorows"
                  },
                  {
                    label: c.splittocols,
                    cmdName: "splittocols"
                  },
                  {
                    label: c.splittocells,
                    cmdName: "splittocells"
                  },
                  "-", {
                    label: c.averageDiseRow,
                    cmdName: "averagedistributerow"
                  },
                  {
                    label: c.averageDisCol,
                    cmdName: "averagedistributecol"
                  },
                  "-", {
                    label: c.edittd,
                    cmdName: "edittd",
                    exec: function() {
                      UE.ui.edittd && new UE.ui.edittd(this),
                        this.getDialog("edittd").open()
                    }
                  },
                  {
                    label: c.edittable,
                    cmdName: "edittable",
                    exec: function() {
                      UE.ui.edittable && new UE.ui.edittable(this),
                        this.getDialog("edittable").open()
                    }
                  },
                  {
                    label: c.setbordervisible,
                    cmdName: "setbordervisible"
                  }]
              },
              {
                group: c.tablesort,
                icon: "tablesort",
                subMenu: [{
                  label: c.enablesort,
                  cmdName: "enablesort"
                },
                  {
                    label: c.disablesort,
                    cmdName: "disablesort"
                  },
                  "-", {
                    label: c.reversecurrent,
                    cmdName: "sorttable",
                    value: "reversecurrent"
                  },
                  {
                    label: c.orderbyasc,
                    cmdName: "sorttable",
                    value: "orderbyasc"
                  },
                  {
                    label: c.reversebyasc,
                    cmdName: "sorttable",
                    value: "reversebyasc"
                  },
                  {
                    label: c.orderbynum,
                    cmdName: "sorttable",
                    value: "orderbynum"
                  },
                  {
                    label: c.reversebynum,
                    cmdName: "sorttable",
                    value: "reversebynum"
                  }]
              },
              {
                group: c.borderbk,
                icon: "borderBack",
                subMenu: [{
                  label: c.setcolor,
                  cmdName: "interlacetable",
                  exec: function() {
                    this.execCommand("interlacetable")
                  }
                },
                  {
                    label: c.unsetcolor,
                    cmdName: "uninterlacetable",
                    exec: function() {
                      this.execCommand("uninterlacetable")
                    }
                  },
                  {
                    label: c.setbackground,
                    cmdName: "settablebackground",
                    exec: function() {
                      this.execCommand("settablebackground", {
                        repeat: !0,
                        colorList: ["#bbb", "#ccc"]
                      })
                    }
                  },
                  {
                    label: c.unsetbackground,
                    cmdName: "cleartablebackground",
                    exec: function() {
                      this.execCommand("cleartablebackground")
                    }
                  },
                  {
                    label: c.redandblue,
                    cmdName: "settablebackground",
                    exec: function() {
                      this.execCommand("settablebackground", {
                        repeat: !0,
                        colorList: ["red", "blue"]
                      })
                    }
                  },
                  {
                    label: c.threecolorgradient,
                    cmdName: "settablebackground",
                    exec: function() {
                      this.execCommand("settablebackground", {
                        repeat: !0,
                        colorList: ["#aaa", "#bbb", "#ccc"]
                      })
                    }
                  }]
              },
              {
                group: c.aligntd,
                icon: "aligntd",
                subMenu: [{
                  cmdName: "cellalignment",
                  value: {
                    align: "left",
                    vAlign: "top"
                  }
                },
                  {
                    cmdName: "cellalignment",
                    value: {
                      align: "center",
                      vAlign: "top"
                    }
                  },
                  {
                    cmdName: "cellalignment",
                    value: {
                      align: "right",
                      vAlign: "top"
                    }
                  },
                  {
                    cmdName: "cellalignment",
                    value: {
                      align: "left",
                      vAlign: "middle"
                    }
                  },
                  {
                    cmdName: "cellalignment",
                    value: {
                      align: "center",
                      vAlign: "middle"
                    }
                  },
                  {
                    cmdName: "cellalignment",
                    value: {
                      align: "right",
                      vAlign: "middle"
                    }
                  },
                  {
                    cmdName: "cellalignment",
                    value: {
                      align: "left",
                      vAlign: "bottom"
                    }
                  },
                  {
                    cmdName: "cellalignment",
                    value: {
                      align: "center",
                      vAlign: "bottom"
                    }
                  },
                  {
                    cmdName: "cellalignment",
                    value: {
                      align: "right",
                      vAlign: "bottom"
                    }
                  }]
              },
              {
                group: c.aligntable,
                icon: "aligntable",
                subMenu: [{
                  cmdName: "tablealignment",
                  className: "left",
                  label: c.tableleft,
                  value: "left"
                },
                  {
                    cmdName: "tablealignment",
                    className: "center",
                    label: c.tablecenter,
                    value: "center"
                  },
                  {
                    cmdName: "tablealignment",
                    className: "right",
                    label: c.tableright,
                    value: "right"
                  }]
              },
              "-", {
                label: c.insertparagraphbefore,
                cmdName: "insertparagraph",
                value: !0
              },
              {
                label: c.insertparagraphafter,
                cmdName: "insertparagraph"
              },
              {
                label: c.copy,
                cmdName: "copy"
              },
              {
                label: c.paste,
                cmdName: "paste"
              }];
          if (d.length) {
            var e = UE.ui.uiUtils;
            a.addListener("contextmenu",
              function(f, g) {
                var h = e.getViewportOffsetByEvent(g);
                a.fireEvent("beforeselectionchange"),
                b && b.destroy();
                for (var i, j = 0,
                       k = []; i = d[j]; j++) {
                  var l; !
                    function(b) {
                      function d() {
                        switch (b.icon) {
                          case "table":
                            return a.getLang("contextMenu.table");
                          case "justifyjustify":
                            return a.getLang("contextMenu.paragraph");
                          case "aligntd":
                            return a.getLang("contextMenu.aligntd");
                          case "aligntable":
                            return a.getLang("contextMenu.aligntable");
                          case "tablesort":
                            return c.tablesort;
                          case "borderBack":
                            return c.borderbk;
                          default:
                            return ""
                        }
                      }
                      if ("-" == b)(l = k[k.length - 1]) && "-" !== l && k.push("-");
                      else if (b.hasOwnProperty("group")) {
                        for (var e, f = 0,
                               g = []; e = b.subMenu[f]; f++) !
                          function(b) {
                            "-" == b ? (l = g[g.length - 1]) && "-" !== l ? g.push("-") : g.splice(g.length - 1) : (a.commands[b.cmdName] || UE.commands[b.cmdName] || b.query) && (b.query ? b.query() : a.queryCommandState(b.cmdName)) > -1 && g.push({
                              label: b.label || a.getLang("contextMenu." + b.cmdName + (b.value || "")) || "",
                              className: "edui-for-" + b.cmdName + (b.className ? " edui-for-" + b.cmdName + "-" + b.className: ""),
                              onclick: b.exec ?
                                function() {
                                  b.exec.call(a)
                                }: function() {
                                  a.execCommand(b.cmdName, b.value)
                                }
                            })
                          } (e);
                        g.length && k.push({
                          label: d(),
                          className: "edui-for-" + b.icon,
                          subMenu: {
                            items: g,
                            editor: a
                          }
                        })
                      } else(a.commands[b.cmdName] || UE.commands[b.cmdName] || b.query) && (b.query ? b.query.call(a) : a.queryCommandState(b.cmdName)) > -1 && k.push({
                        label: b.label || a.getLang("contextMenu." + b.cmdName),
                        className: "edui-for-" + (b.icon ? b.icon: b.cmdName + (b.value || "")),
                        onclick: b.exec ?
                          function() {
                            b.exec.call(a)
                          }: function() {
                            a.execCommand(b.cmdName, b.value)
                          }
                      })
                    } (i)
                }
                if ("-" == k[k.length - 1] && k.pop(), b = new UE.ui.Menu({
                  items: k,
                  className: "edui-contextmenu",
                  editor: a
                }), b.render(), b.showAt(h), a.fireEvent("aftershowcontextmenu", b), domUtils.preventDefault(g), browser.ie) {
                  var m;
                  try {
                    m = a.selection.getNative().createRange()
                  } catch(n) {
                    return
                  }
                  if (m.item) {
                    var o = new dom.Range(a.document);
                    o.selectNode(m.item(0)).select(!0, !0)
                  }
                }
              }),
              a.addListener("aftershowcontextmenu",
                function(b, c) {
                  if (a.zeroclipboard) {
                    var d = c.items;
                    for (var e in d)"edui-for-copy" == d[e].className && a.zeroclipboard.clip(d[e].getDom())
                  }
                })
          }
        }
      },
      UE.plugins.shortcutmenu = function() {
        var a, b = this,
          c = b.options.shortcutMenu || [];
        c.length && (b.addListener("contextmenu mouseup",
          function(b, d) {
            var e = this,
              f = {
                type: b,
                target: d.target || d.srcElement,
                screenX: d.screenX,
                screenY: d.screenY,
                clientX: d.clientX,
                clientY: d.clientY
              };
            if (setTimeout(function() {
              var d = e.selection.getRange();
              d.collapsed !== !1 && "contextmenu" != b || (a || (a = new baidu.editor.ui.ShortCutMenu({
                editor: e,
                items: c,
                theme: e.options.theme,
                className: "edui-shortcutmenu"
              }), a.render(), e.fireEvent("afterrendershortcutmenu", a)), a.show(f, !!UE.plugins.contextmenu))
            }), "contextmenu" == b && (domUtils.preventDefault(d), browser.ie9below)) {
              var g;
              try {
                g = e.selection.getNative().createRange()
              } catch(d) {
                return
              }
              if (g.item) {
                var h = new dom.Range(e.document);
                h.selectNode(g.item(0)).select(!0, !0)
              }
            }
          }), b.addListener("keydown",
          function(b) {
            "keydown" == b && a && !a.isHidden && a.hide()
          }))
      },
      UE.plugins.basestyle = function() {
        var a = {
            bold: ["strong", "b"],
            italic: ["em", "i"],
            subscript: ["sub"],
            superscript: ["sup"]
          },
          b = function(a, b) {
            return domUtils.filterNodeList(a.selection.getStartElementPath(), b)
          },
          c = this;
        c.addshortcutkey({
          Bold: "ctrl+66",
          Italic: "ctrl+73",
          Underline: "ctrl+85"
        }),
          c.addInputRule(function(a) {
            utils.each(a.getNodesByTagName("b i"),
              function(a) {
                switch (a.tagName) {
                  case "b":
                    a.tagName = "strong";
                    break;
                  case "i":
                    a.tagName = "em"
                }
              })
          });
        for (var d in a) !
          function(a, d) {
            c.commands[a] = {
              execCommand: function(a) {
                var e = c.selection.getRange(),
                  f = b(this, d);
                if (e.collapsed) {
                  if (f) {
                    var g = c.document.createTextNode("");
                    e.insertNode(g).removeInlineStyle(d),
                      e.setStartBefore(g),
                      domUtils.remove(g)
                  } else {
                    var h = e.document.createElement(d[0]);
                    "superscript" != a && "subscript" != a || (g = c.document.createTextNode(""), e.insertNode(g).removeInlineStyle(["sub", "sup"]).setStartBefore(g).collapse(!0)),
                      e.insertNode(h).setStart(h, 0)
                  }
                  e.collapse(!0)
                } else "superscript" != a && "subscript" != a || f && f.tagName.toLowerCase() == a || e.removeInlineStyle(["sub", "sup"]),
                  f ? e.removeInlineStyle(d) : e.applyInlineStyle(d[0]);
                e.select()
              },
              queryCommandState: function() {
                return b(this, d) ? 1 : 0
              }
            }
          } (d, a[d])
      },
      UE.plugins.elementpath = function() {
        var a, b, c = this;
        c.setOpt("elementPathEnabled", !0),
        c.options.elementPathEnabled && (c.commands.elementpath = {
          execCommand: function(d, e) {
            var f = b[e],
              g = c.selection.getRange();
            a = 1 * e,
              g.selectNode(f).select()
          },
          queryCommandValue: function() {
            var c = [].concat(this.selection.getStartElementPath()).reverse(),
              d = [];
            b = c;
            for (var e, f = 0; e = c[f]; f++) if (3 != e.nodeType) {
              var g = e.tagName.toLowerCase();
              if ("img" == g && e.getAttribute("anchorname") && (g = "anchor"), d[f] = g, a == f) {
                a = -1;
                break
              }
            }
            return d
          }
        })
      },
      UE.plugins.formatmatch = function() {
        function a(f, g) {
          function h(a) {
            return m && a.selectNode(m),
              a.applyInlineStyle(d[d.length - 1].tagName, null, d)
          }
          if (browser.webkit) var i = "IMG" == g.target.tagName ? g.target: null;
          c.undoManger && c.undoManger.save();
          var j = c.selection.getRange(),
            k = i || j.getClosedNode();
          if (b && k && "IMG" == k.tagName) k.style.cssText += ";float:" + (b.style.cssFloat || b.style.styleFloat || "none") + ";display:" + (b.style.display || "inline"),
            b = null;
          else if (!b) {
            var l = j.collapsed;
            if (l) {
              var m = c.document.createTextNode("match");
              j.insertNode(m).select()
            }
            c.__hasEnterExecCommand = !0;
            var n = c.options.removeFormatAttributes;
            c.options.removeFormatAttributes = "",
              c.execCommand("removeformat"),
              c.options.removeFormatAttributes = n,
              c.__hasEnterExecCommand = !1,
              j = c.selection.getRange(),
            d.length && h(j),
            m && j.setStartBefore(m).collapse(!0),
              j.select(),
            m && domUtils.remove(m)
          }
          c.undoManger && c.undoManger.save(),
            c.removeListener("mouseup", a),
            e = 0
        }
        var b, c = this,
          d = [],
          e = 0;
        c.addListener("reset",
          function() {
            d = [],
              e = 0
          }),
          c.commands.formatmatch = {
            execCommand: function(f) {
              if (e) return e = 0,
                d = [],
                void c.removeListener("mouseup", a);
              var g = c.selection.getRange();
              if (b = g.getClosedNode(), !b || "IMG" != b.tagName) {
                g.collapse(!0).shrinkBoundary();
                var h = g.startContainer;
                d = domUtils.findParents(h, !0,
                  function(a) {
                    return ! domUtils.isBlockElm(a) && 1 == a.nodeType
                  });
                for (var i, j = 0; i = d[j]; j++) if ("A" == i.tagName) {
                  d.splice(j, 1);
                  break
                }
              }
              c.addListener("mouseup", a),
                e = 1
            },
            queryCommandState: function() {
              return e
            },
            notNeedUndo: 1
          }
      },
      UE.plugin.register("searchreplace",
        function() {
          function a(a, b, c) {
            var d = b.searchStr;
            b.dir == -1 && (a = a.split("").reverse().join(""), d = d.split("").reverse().join(""), c = a.length - c);
            for (var e, f = new RegExp(d, "g" + (b.casesensitive ? "": "i")); e = f.exec(a);) if (e.index >= c) return b.dir == -1 ? a.length - e.index - b.searchStr.length: e.index;
            return - 1
          }
          function b(b, c, d) {
            var e, f, h = d.all || 1 == d.dir ? "getNextDomNode": "getPreDomNode";
            domUtils.isBody(b) && (b = b.firstChild);
            for (var i = 1; b;) {
              if (e = 3 == b.nodeType ? b.nodeValue: b[browser.ie ? "innerText": "textContent"], f = a(e, d, c), i = 0, f != -1) return {
                node: b,
                index: f
              };
              for (b = domUtils[h](b); b && g[b.nodeName.toLowerCase()];) b = domUtils[h](b, !0);
              b && (c = d.dir == -1 ? (3 == b.nodeType ? b.nodeValue: b[browser.ie ? "innerText": "textContent"]).length: 0)
            }
          }
          function c(a, b, d) {
            for (var e, f = 0,
                   g = a.firstChild,
                   h = 0; g;) {
              if (3 == g.nodeType) {
                if (h = g.nodeValue.replace(/(^[\t\r\n]+)|([\t\r\n]+$)/, "").length, f += h, f >= b) return {
                  node: g,
                  index: h - (f - b)
                }
              } else if (!dtd.$empty[g.tagName] && (h = g[browser.ie ? "innerText": "textContent"].replace(/(^[\t\r\n]+)|([\t\r\n]+$)/, "").length, f += h, f >= b && (e = c(g, h - (f - b), d)))) return e;
              g = domUtils.getNextDomNode(g)
            }
          }
          function d(a, d) {
            var f, g = a.selection.getRange(),
              h = d.searchStr,
              i = a.document.createElement("span");
            if (i.innerHTML = "$$ueditor_searchreplace_key$$", g.shrinkBoundary(!0), !g.collapsed) {
              g.select();
              var j = a.selection.getText();
              if (new RegExp("^" + d.searchStr + "$", d.casesensitive ? "": "i").test(j)) {
                if (void 0 != d.replaceStr) return e(g, d.replaceStr),
                  g.select(),
                  !0;
                g.collapse(d.dir == -1)
              }
            }
            g.insertNode(i),
              g.enlargeToBlockElm(!0),
              f = g.startContainer;
            var k = f[browser.ie ? "innerText": "textContent"].indexOf("$$ueditor_searchreplace_key$$");
            g.setStartBefore(i),
              domUtils.remove(i);
            var l = b(f, k, d);
            if (l) {
              var m = c(l.node, l.index, h),
                n = c(l.node, l.index + h.length, h);
              return g.setStart(m.node, m.index).setEnd(n.node, n.index),
              void 0 !== d.replaceStr && e(g, d.replaceStr),
                g.select(),
                !0
            }
            g.setCursor()
          }
          function e(a, b) {
            b = f.document.createTextNode(b),
              a.deleteContents().insertNode(b)
          }
          var f = this,
            g = {
              table: 1,
              tbody: 1,
              tr: 1,
              ol: 1,
              ul: 1
            };
          return {
            commands: {
              searchreplace: {
                execCommand: function(a, b) {
                  utils.extend(b, {
                      all: !1,
                      casesensitive: !1,
                      dir: 1
                    },
                    !0);
                  var c = 0;
                  if (b.all) {
                    var e = f.selection.getRange(),
                      g = f.body.firstChild;
                    for (g && 1 == g.nodeType ? (e.setStart(g, 0), e.shrinkBoundary(!0)) : 3 == g.nodeType && e.setStartBefore(g), e.collapse(!0).select(!0), void 0 !== b.replaceStr && f.fireEvent("saveScene"); d(this, b);) c++;
                    c && f.fireEvent("saveScene")
                  } else void 0 !== b.replaceStr && f.fireEvent("saveScene"),
                  d(this, b) && c++,
                  c && f.fireEvent("saveScene");
                  return c
                },
                notNeedUndo: 1
              }
            }
          }
        }),
      UE.plugins.customstyle = function() {
        var a = this;
        a.setOpt({
          customstyle: [{
            tag: "h1",
            name: "tc",
            style: "font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;"
          },
            {
              tag: "h1",
              name: "tl",
              style: "font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:left;margin:0 0 10px 0;"
            },
            {
              tag: "span",
              name: "im",
              style: "font-size:16px;font-style:italic;font-weight:bold;line-height:18px;"
            },
            {
              tag: "span",
              name: "hi",
              style: "font-size:16px;font-style:italic;font-weight:bold;color:rgb(51, 153, 204);line-height:18px;"
            }]
        }),
          a.commands.customstyle = {
            execCommand: function(a, b) {
              var c, d, e = this,
                f = b.tag,
                g = domUtils.findParent(e.selection.getStart(),
                  function(a) {
                    return a.getAttribute("label")
                  },
                  !0),
                h = {};
              for (var i in b) void 0 !== b[i] && (h[i] = b[i]);
              if (delete h.tag, g && g.getAttribute("label") == b.label) {
                if (c = this.selection.getRange(), d = c.createBookmark(), c.collapsed) if (dtd.$block[g.tagName]) {
                  var j = e.document.createElement("p");
                  domUtils.moveChild(g, j),
                    g.parentNode.insertBefore(j, g),
                    domUtils.remove(g)
                } else domUtils.remove(g, !0);
                else {
                  var k = domUtils.getCommonAncestor(d.start, d.end),
                    l = domUtils.getElementsByTagName(k, f);
                  new RegExp(f, "i").test(k.tagName) && l.push(k);
                  for (var m, n = 0; m = l[n++];) if (m.getAttribute("label") == b.label) {
                    var o = domUtils.getPosition(m, d.start),
                      p = domUtils.getPosition(m, d.end);
                    if ((o & domUtils.POSITION_FOLLOWING || o & domUtils.POSITION_CONTAINS) && (p & domUtils.POSITION_PRECEDING || p & domUtils.POSITION_CONTAINS) && dtd.$block[f]) {
                      var j = e.document.createElement("p");
                      domUtils.moveChild(m, j),
                        m.parentNode.insertBefore(j, m)
                    }
                    domUtils.remove(m, !0)
                  }
                  g = domUtils.findParent(k,
                    function(a) {
                      return a.getAttribute("label") == b.label
                    },
                    !0),
                  g && domUtils.remove(g, !0)
                }
                c.moveToBookmark(d).select()
              } else if (dtd.$block[f]) {
                if (this.execCommand("paragraph", f, h, "customstyle"), c = e.selection.getRange(), !c.collapsed) {
                  c.collapse(),
                    g = domUtils.findParent(e.selection.getStart(),
                      function(a) {
                        return a.getAttribute("label") == b.label
                      },
                      !0);
                  var q = e.document.createElement("p");
                  domUtils.insertAfter(g, q),
                    domUtils.fillNode(e.document, q),
                    c.setStart(q, 0).setCursor()
                }
              } else {
                if (c = e.selection.getRange(), c.collapsed) return g = e.document.createElement(f),
                  domUtils.setAttributes(g, h),
                  void c.insertNode(g).setStart(g, 0).setCursor();
                d = c.createBookmark(),
                  c.applyInlineStyle(f, h).moveToBookmark(d).select()
              }
            },
            queryCommandValue: function() {
              var a = domUtils.filterNodeList(this.selection.getStartElementPath(),
                function(a) {
                  return a.getAttribute("label")
                });
              return a ? a.getAttribute("label") : ""
            }
          },
          a.addListener("keyup",
            function(b, c) {
              var d = c.keyCode || c.which;
              if (32 == d || 13 == d) {
                var e = a.selection.getRange();
                if (e.collapsed) {
                  var f = domUtils.findParent(a.selection.getStart(),
                    function(a) {
                      return a.getAttribute("label")
                    },
                    !0);
                  if (f && dtd.$block[f.tagName] && domUtils.isEmptyNode(f)) {
                    var g = a.document.createElement("p");
                    domUtils.insertAfter(f, g),
                      domUtils.fillNode(a.document, g),
                      domUtils.remove(f),
                      e.setStart(g, 0).setCursor()
                  }
                }
              }
            })
      },
      UE.plugins.catchremoteimage = function() {
        var me = this,
          ajax = UE.ajax;
        me.options.catchRemoteImageEnable !== !1 && (me.setOpt({
          catchRemoteImageEnable: !1
        }), me.addListener("afterpaste",
          function() {
            me.fireEvent("catchRemoteImage")
          }), me.addListener("catchRemoteImage",
          function() {
            function catchremoteimage(a, b) {
              var c = utils.serializeParam(me.queryCommandValue("serverparam")) || "",
                d = utils.formatUrl(catcherActionUrl + (catcherActionUrl.indexOf("?") == -1 ? "?": "&") + c),
                e = utils.isCrossDomainUrl(d),
                f = {
                  method: "POST",
                  dataType: e ? "jsonp": "",
                  timeout: 6e4,
                  onsuccess: b.success,
                  onerror: b.error
                };
              f[catcherFieldName] = a,
                ajax.request(d, f)
            }
            for (var catcherLocalDomain = me.getOpt("catcherLocalDomain"), catcherActionUrl = me.getActionUrl(me.getOpt("catcherActionName")), catcherUrlPrefix = me.getOpt("catcherUrlPrefix"), catcherFieldName = me.getOpt("catcherFieldName"), remoteImages = [], imgs = domUtils.getElementsByTagName(me.document, "img"), test = function(a, b) {
                if (a.indexOf(location.host) != -1 || /(^\.)|(^\/)/.test(a)) return ! 0;
                if (b) for (var c, d = 0; c = b[d++];) if (a.indexOf(c) !== -1) return ! 0;
                return ! 1
              },
                   i = 0, ci; ci = imgs[i++];) if (!ci.getAttribute("word_img")) {
              var src = ci.getAttribute("_src") || ci.src || "";
              /^(https?|ftp):/i.test(src) && !test(src, catcherLocalDomain) && remoteImages.push(src)
            }
            remoteImages.length && catchremoteimage(remoteImages, {
              success: function(r) {
                try {
                  var info = void 0 !== r.state ? r: eval("(" + r.responseText + ")")
                } catch(e) {
                  return
                }
                var i, j, ci, cj, oldSrc, newSrc, list = info.list;
                for (i = 0; ci = imgs[i++];) for (oldSrc = ci.getAttribute("_src") || ci.src || "", j = 0; cj = list[j++];) if (oldSrc == cj.source && "SUCCESS" == cj.state) {
                  newSrc = catcherUrlPrefix + cj.url,
                    domUtils.setAttributes(ci, {
                      src: newSrc,
                      _src: newSrc
                    });
                  break
                }
                me.fireEvent("catchremotesuccess")
              },
              error: function() {
                me.fireEvent("catchremoteerror")
              }
            })
          }))
      },
      UE.plugin.register("snapscreen",
        function() {
          function getLocation(a) {
            var b, c = document.createElement("a"),
              d = utils.serializeParam(me.queryCommandValue("serverparam")) || "";
            return c.href = a,
            browser.ie && (c.href = c.href),
              b = c.search,
            d && (b = b + (b.indexOf("?") == -1 ? "?": "&") + d, b = b.replace(/[&]+/gi, "&")),
              {
                port: c.port,
                hostname: c.hostname,
                path: c.pathname + b || +c.hash
              }
          }
          var me = this,
            snapplugin;
          return {
            commands: {
              snapscreen: {
                execCommand: function(cmd) {
                  function onSuccess(rs) {
                    try {
                      if (rs = eval("(" + rs + ")"), "SUCCESS" == rs.state) {
                        var opt = me.options;
                        me.execCommand("insertimage", {
                          src: opt.snapscreenUrlPrefix + rs.url,
                          _src: opt.snapscreenUrlPrefix + rs.url,
                          alt: rs.title || "",
                          floatStyle: opt.snapscreenImgAlign
                        })
                      } else alert(rs.state)
                    } catch(e) {
                      alert(lang.callBackErrorMsg)
                    }
                  }
                  var url, local, res, lang = me.getLang("snapScreen_plugin");
                  if (!snapplugin) {
                    var container = me.container,
                      doc = me.container.ownerDocument || me.container.document;
                    snapplugin = doc.createElement("object");
                    try {
                      snapplugin.type = "application/x-pluginbaidusnap"
                    } catch(e) {
                      return
                    }
                    snapplugin.style.cssText = "position:absolute;left:-9999px;width:0;height:0;",
                      snapplugin.setAttribute("width", "0"),
                      snapplugin.setAttribute("height", "0"),
                      container.appendChild(snapplugin)
                  }
                  url = me.getActionUrl(me.getOpt("snapscreenActionName")),
                    local = getLocation(url),
                    setTimeout(function() {
                        try {
                          res = snapplugin.saveSnapshot(local.hostname, local.path, local.port)
                        } catch(a) {
                          return void me.ui._dialogs.snapscreenDialog.open()
                        }
                        onSuccess(res)
                      },
                      50)
                },
                queryCommandState: function() {
                  return navigator.userAgent.indexOf("Windows", 0) != -1 ? 0 : -1
                }
              }
            }
          }
        }),
      UE.commands.insertparagraph = {
        execCommand: function(a, b) {
          for (var c, d = this,
                 e = d.selection.getRange(), f = e.startContainer; f && !domUtils.isBody(f);) c = f,
            f = f.parentNode;
          if (c) {
            var g = d.document.createElement("p");
            b ? c.parentNode.insertBefore(g, c) : c.parentNode.insertBefore(g, c.nextSibling),
              domUtils.fillNode(d.document, g),
              e.setStart(g, 0).setCursor(!1, !0)
          }
        }
      },
      UE.plugin.register("webapp",
        function() {
          function a(a, c) {
            return c ? '<iframe class="edui-faked-webapp" title="' + a.title + '" ' + (a.align && !a.cssfloat ? 'align="' + a.align + '"': "") + (a.cssfloat ? 'style="float:' + a.cssfloat + '"': "") + 'width="' + a.width + '" height="' + a.height + '"  scrolling="no" frameborder="0" src="' + a.url + '" logo_url = "' + a.logo + '"></iframe>': '<img title="' + a.title + '" width="' + a.width + '" height="' + a.height + '" src="' + b.options.UEDITOR_HOME_URL + 'themes/default/images/spacer.gif" _logo_url="' + a.logo + '" style="background:url(' + a.logo + ') no-repeat center center; border:1px solid gray;" class="edui-faked-webapp" _url="' + a.url + '" ' + (a.align && !a.cssfloat ? 'align="' + a.align + '"': "") + (a.cssfloat ? 'style="float:' + a.cssfloat + '"': "") + "/>"
          }
          var b = this;
          return {
            outputRule: function(b) {
              utils.each(b.getNodesByTagName("img"),
                function(b) {
                  var c;
                  if ("edui-faked-webapp" == b.getAttr("class")) {
                    c = a({
                        title: b.getAttr("title"),
                        width: b.getAttr("width"),
                        height: b.getAttr("height"),
                        align: b.getAttr("align"),
                        cssfloat: b.getStyle("float"),
                        url: b.getAttr("_url"),
                        logo: b.getAttr("_logo_url")
                      },
                      !0);
                    var d = UE.uNode.createElement(c);
                    b.parentNode.replaceChild(d, b)
                  }
                })
            },
            inputRule: function(b) {
              utils.each(b.getNodesByTagName("iframe"),
                function(b) {
                  if ("edui-faked-webapp" == b.getAttr("class")) {
                    var c = UE.uNode.createElement(a({
                      title: b.getAttr("title"),
                      width: b.getAttr("width"),
                      height: b.getAttr("height"),
                      align: b.getAttr("align"),
                      cssfloat: b.getStyle("float"),
                      url: b.getAttr("src"),
                      logo: b.getAttr("logo_url")
                    }));
                    b.parentNode.replaceChild(c, b)
                  }
                })
            },
            commands: {
              webapp: {
                execCommand: function(b, c) {
                  var d = this,
                    e = a(utils.extend(c, {
                      align: "none"
                    }), !1);
                  d.execCommand("inserthtml", e)
                },
                queryCommandState: function() {
                  var a = this,
                    b = a.selection.getRange().getClosedNode(),
                    c = b && "edui-faked-webapp" == b.className;
                  return c ? 1 : 0
                }
              }
            }
          }
        }),
      UE.plugins.template = function() {
        UE.commands.template = {
          execCommand: function(a, b) {
            b.html && this.execCommand("inserthtml", b.html)
          }
        },
          this.addListener("click",
            function(a, b) {
              var c = b.target || b.srcElement,
                d = this.selection.getRange(),
                e = domUtils.findParent(c,
                  function(a) {
                    if (a.className && domUtils.hasClass(a, "ue_t")) return a
                  },
                  !0);
              e && d.selectNode(e).shrinkBoundary().select()
            }),
          this.addListener("keydown",
            function(a, b) {
              var c = this.selection.getRange();
              if (!c.collapsed && !(b.ctrlKey || b.metaKey || b.shiftKey || b.altKey)) {
                var d = domUtils.findParent(c.startContainer,
                  function(a) {
                    if (a.className && domUtils.hasClass(a, "ue_t")) return a
                  },
                  !0);
                d && domUtils.removeClasses(d, ["ue_t"])
              }
            })
      },
      UE.plugin.register("music",
        function() {
          function a(a, c, d, e, f, g) {
            return g ? '<embed type="application/x-shockwave-flash" class="edui-faked-music" pluginspage="http://www.macromedia.com/go/getflashplayer" src="' + a + '" width="' + c + '" height="' + d + '" ' + (e && !f ? 'align="' + e + '"': "") + (f ? 'style="float:' + f + '"': "") + ' wmode="transparent" play="true" loop="false" menu="false" allowscriptaccess="never" allowfullscreen="true" >': "<img " + (e && !f ? 'align="' + e + '"': "") + (f ? 'style="float:' + f + '"': "") + ' width="' + c + '" height="' + d + '" _url="' + a + '" class="edui-faked-music" src="' + b.options.langPath + b.options.lang + '/images/music.png" />'
          }
          var b = this;
          return {
            outputRule: function(b) {
              utils.each(b.getNodesByTagName("img"),
                function(b) {
                  var c;
                  if ("edui-faked-music" == b.getAttr("class")) {
                    var d = b.getStyle("float"),
                      e = b.getAttr("align");
                    c = a(b.getAttr("_url"), b.getAttr("width"), b.getAttr("height"), e, d, !0);
                    var f = UE.uNode.createElement(c);
                    b.parentNode.replaceChild(f, b)
                  }
                })
            },
            inputRule: function(b) {
              utils.each(b.getNodesByTagName("embed"),
                function(b) {
                  if ("edui-faked-music" == b.getAttr("class")) {
                    var c = b.getStyle("float"),
                      d = b.getAttr("align");
                    html = a(b.getAttr("src"), b.getAttr("width"), b.getAttr("height"), d, c, !1);
                    var e = UE.uNode.createElement(html);
                    b.parentNode.replaceChild(e, b)
                  }
                })
            },
            commands: {
              music: {
                execCommand: function(b, c) {
                  var d = this,
                    e = a(c.url, c.width || 400, c.height || 95, "none", !1);
                  d.execCommand("inserthtml", e)
                },
                queryCommandState: function() {
                  var a = this,
                    b = a.selection.getRange().getClosedNode(),
                    c = b && "edui-faked-music" == b.className;
                  return c ? 1 : 0
                }
              }
            }
          }
        }),
      UE.plugin.register("autoupload",
        function() {
          function a(a, b) {
            var c, d, e, f, g, h, i, j, k = b,
              l = /image\/\w+/i.test(a.type) ? "image": "file",
              m = "loading_" + ( + new Date).toString(36);
            if (c = k.getOpt(l + "FieldName"), d = k.getOpt(l + "UrlPrefix"), e = k.getOpt(l + "MaxSize"), f = k.getOpt(l + "AllowFiles"), g = k.getActionUrl(k.getOpt(l + "ActionName")), i = function(a) {
              var b = k.document.getElementById(m);
              b && domUtils.remove(b),
                k.fireEvent("showmessage", {
                  id: m,
                  content: a,
                  type: "error",
                  timeout: 4e3
                })
            },
              "image" == l ? (h = '<img class="loadingclass" id="' + m + '" src="' + k.options.themePath + k.options.theme + '/images/spacer.gif" title="' + (k.getLang("autoupload.loading") || "") + '" >', j = function(a) {
                var b = d + a.url,
                  c = k.document.getElementById(m);
                c && (c.setAttribute("src", b), c.setAttribute("_src", b), c.setAttribute("title", a.title || ""), c.setAttribute("alt", a.original || ""), c.removeAttribute("id"), domUtils.removeClasses(c, "loadingclass"))
              }) : (h = '<p><img class="loadingclass" id="' + m + '" src="' + k.options.themePath + k.options.theme + '/images/spacer.gif" title="' + (k.getLang("autoupload.loading") || "") + '" ></p>', j = function(a) {
                var b = d + a.url,
                  c = k.document.getElementById(m),
                  e = k.selection.getRange(),
                  f = e.createBookmark();
                e.selectNode(c).select(),
                  k.execCommand("insertfile", {
                    url: b
                  }),
                  e.moveToBookmark(f).select()
              }), k.execCommand("inserthtml", h), !k.getOpt(l + "ActionName")) return void i(k.getLang("autoupload.errorLoadConfig"));
            if (a.size > e) return void i(k.getLang("autoupload.exceedSizeError"));
            var n = a.name ? a.name.substr(a.name.lastIndexOf(".")) : "";
            if (n && "image" != l || f && (f.join("") + ".").indexOf(n.toLowerCase() + ".") == -1) return void i(k.getLang("autoupload.exceedTypeError"));
            var o = new XMLHttpRequest,
              p = new FormData,
              q = utils.serializeParam(k.queryCommandValue("serverparam")) || "",
              r = utils.formatUrl(g + (g.indexOf("?") == -1 ? "?": "&") + q);
            p.append(c, a, a.name || "blob." + a.type.substr("image/".length)),
              p.append("type", "ajax"),
              o.open("post", r, !0),
              o.setRequestHeader("X-Requested-With", "XMLHttpRequest"),
              o.addEventListener("load",
                function(a) {
                  try {
                    var b = new Function("return " + utils.trim(a.target.response))();
                    "SUCCESS" == b.state && b.url ? j(b) : i(b.state)
                  } catch(c) {
                    i(k.getLang("autoupload.loadError"))
                  }
                }),
              o.send(p)
          }
          function b(a) {
            return a.clipboardData && a.clipboardData.items && 1 == a.clipboardData.items.length && /^image\//.test(a.clipboardData.items[0].type) ? a.clipboardData.items: null
          }
          function c(a) {
            return a.dataTransfer && a.dataTransfer.files ? a.dataTransfer.files: null
          }
          return {
            outputRule: function(a) {
              utils.each(a.getNodesByTagName("img"),
                function(a) { / \b(loaderrorclass) | (bloaderrorclass)\b / .test(a.getAttr("class")) && a.parentNode.removeChild(a)
                }),
                utils.each(a.getNodesByTagName("p"),
                  function(a) { / \bloadpara\b / .test(a.getAttr("class")) && a.parentNode.removeChild(a)
                  })
            },
            bindEvents: {
              ready: function(d) {
                var e = this;
                window.FormData && window.FileReader && (domUtils.on(e.body, "paste drop",
                  function(d) {
                    var f, g = !1;
                    if (f = "paste" == d.type ? b(d) : c(d)) {
                      for (var h, i = f.length; i--;) h = f[i],
                      h.getAsFile && (h = h.getAsFile()),
                      h && h.size > 0 && (a(h, e), g = !0);
                      g && d.preventDefault()
                    }
                  }), domUtils.on(e.body, "dragover",
                  function(a) {
                    "Files" == a.dataTransfer.types[0] && a.preventDefault()
                  }), utils.cssRule("loading", ".loadingclass{display:inline-block;cursor:default;background: url('" + this.options.themePath + this.options.theme + "/images/loading.gif') no-repeat center center transparent;border:1px solid #cccccc;margin-left:1px;height: 22px;width: 22px;}\n.loaderrorclass{display:inline-block;cursor:default;background: url('" + this.options.themePath + this.options.theme + "/images/loaderror.png') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}", this.document))
              }
            }
          }
        }),
      UE.plugin.register("autosave",
        function() {
          function a(a) {
            var f;
            if (! (new Date - c < d)) {
              if (!a.hasContents()) return void(e && b.removePreferences(e));
              c = new Date,
                a._saveFlag = null,
                f = b.body.innerHTML,
              a.fireEvent("beforeautosave", {
                content: f
              }) !== !1 && (b.setPreferences(e, f), a.fireEvent("afterautosave", {
                content: f
              }))
            }
          }
          var b = this,
            c = new Date,
            d = 20,
            e = null;
          return {
            defaultOptions: {
              saveInterval: 500
            },
            bindEvents: {
              ready: function() {
                var a = "-drafts-data",
                  c = null;
                c = b.key ? b.key + a: (b.container.parentNode.id || "ue-common") + a,
                  e = (location.protocol + location.host + location.pathname).replace(/[.:\/]/g, "_") + c
              },
              contentchange: function() {
                e && (b._saveFlag && window.clearTimeout(b._saveFlag), b.options.saveInterval > 0 ? b._saveFlag = window.setTimeout(function() {
                    a(b)
                  },
                  b.options.saveInterval) : a(b))
              }
            },
            commands: {
              clearlocaldata: {
                execCommand: function(a, c) {
                  e && b.getPreferences(e) && b.removePreferences(e)
                },
                notNeedUndo: !0,
                ignoreContentChange: !0
              },
              getlocaldata: {
                execCommand: function(a, c) {
                  return e ? b.getPreferences(e) || "": ""
                },
                notNeedUndo: !0,
                ignoreContentChange: !0
              },
              drafts: {
                execCommand: function(a, c) {
                  e && (b.body.innerHTML = b.getPreferences(e) || "<p>" + domUtils.fillHtml + "</p>", b.focus(!0))
                },
                queryCommandState: function() {
                  return e ? null === b.getPreferences(e) ? -1 : 0 : -1
                },
                notNeedUndo: !0,
                ignoreContentChange: !0
              }
            }
          }
        }),
      UE.plugin.register("charts",
        function() {
          function a(a) {
            var b = null,
              c = 0;
            if (a.rows.length < 2) return ! 1;
            if (a.rows[0].cells.length < 2) return ! 1;
            b = a.rows[0].cells,
              c = b.length;
            for (var d, e = 0; d = b[e]; e++) if ("th" !== d.tagName.toLowerCase()) return ! 1;
            for (var f, e = 1; f = a.rows[e]; e++) {
              if (f.cells.length != c) return ! 1;
              if ("th" !== f.cells[0].tagName.toLowerCase()) return ! 1;
              for (var d, g = 1; d = f.cells[g]; g++) {
                var h = utils.trim(d.innerText || d.textContent || "");
                if (h = h.replace(new RegExp(UE.dom.domUtils.fillChar, "g"), "").replace(/^\s+|\s+$/g, ""), !/^\d*\.?\d+$/.test(h)) return ! 1
              }
            }
            return ! 0
          }
          var b = this;
          return {
            bindEvents: {
              chartserror: function() {}
            },
            commands: {
              charts: {
                execCommand: function(c, d) {
                  var e = domUtils.findParentByTagName(this.selection.getRange().startContainer, "table", !0),
                    f = [],
                    g = {};
                  if (!e) return ! 1;
                  if (!a(e)) return b.fireEvent("chartserror"),
                    !1;
                  g.title = d.title || "",
                    g.subTitle = d.subTitle || "",
                    g.xTitle = d.xTitle || "",
                    g.yTitle = d.yTitle || "",
                    g.suffix = d.suffix || "",
                    g.tip = d.tip || "",
                    g.dataFormat = d.tableDataFormat || "",
                    g.chartType = d.chartType || 0;
                  for (var h in g) g.hasOwnProperty(h) && f.push(h + ":" + g[h]);
                  e.setAttribute("data-chart", f.join(";")),
                    domUtils.addClass(e, "edui-charts-table")
                },
                queryCommandState: function(b, c) {
                  var d = domUtils.findParentByTagName(this.selection.getRange().startContainer, "table", !0);
                  return d && a(d) ? 0 : -1
                }
              }
            },
            inputRule: function(a) {
              utils.each(a.getNodesByTagName("table"),
                function(a) {
                  void 0 !== a.getAttr("data-chart") && a.setAttr("style")
                })
            },
            outputRule: function(a) {
              utils.each(a.getNodesByTagName("table"),
                function(a) {
                  void 0 !== a.getAttr("data-chart") && a.setAttr("style", "display: none;")
                })
            }
          }
        }),
      UE.plugin.register("section",
        function() {
          function a(a) {
            this.tag = "",
              this.level = -1,
              this.dom = null,
              this.nextSection = null,
              this.previousSection = null,
              this.parentSection = null,
              this.startAddress = [],
              this.endAddress = [],
              this.children = []
          }
          function b(b) {
            var c = new a;
            return utils.extend(c, b)
          }
          function c(a, b) {
            for (var c = b,
                   d = 0; d < a.length; d++) {
              if (!c.childNodes) return null;
              c = c.childNodes[a[d]]
            }
            return c
          }
          var d = this;
          return {
            bindMultiEvents: {
              type: "aftersetcontent afterscencerestore",
              handler: function() {
                d.fireEvent("updateSections")
              }
            },
            bindEvents: {
              ready: function() {
                d.fireEvent("updateSections"),
                  domUtils.on(d.body, "drop paste",
                    function() {
                      d.fireEvent("updateSections")
                    })
              },
              afterexeccommand: function(a, b) {
                "paragraph" == b && d.fireEvent("updateSections")
              },
              keyup: function(a, b) {
                var c = this,
                  d = c.selection.getRange();
                if (1 != d.collapsed) c.fireEvent("updateSections");
                else {
                  var e = b.keyCode || b.which;
                  13 != e && 8 != e && 46 != e || c.fireEvent("updateSections")
                }
              }
            },
            commands: {
              getsections: {
                execCommand: function(a, c) {
                  function d(a) {
                    for (var b = 0; b < f.length; b++) if (f[b](a)) return b;
                    return - 1
                  }
                  function e(a, c) {
                    for (var f, g, i, k = null,
                           l = a.childNodes,
                           m = 0,
                           n = l.length; m < n; m++) if (i = l[m], f = d(i), f >= 0) {
                      var o = h.selection.getRange().selectNode(i).createAddress(!0).startAddress,
                        p = b({
                          tag: i.tagName,
                          title: i.innerText || i.textContent || "",
                          level: f,
                          dom: i,
                          startAddress: utils.clone(o, []),
                          endAddress: utils.clone(o, []),
                          children: []
                        });
                      for (j.nextSection = p, p.previousSection = j, g = j; f <= g.level;) g = g.parentSection;
                      p.parentSection = g,
                        g.children.push(p),
                        k = j = p
                    } else 1 === i.nodeType && e(i, c),
                    k && k.endAddress[k.endAddress.length - 1]++
                  }
                  for (var f = c || ["h1", "h2", "h3", "h4", "h5", "h6"], g = 0; g < f.length; g++)"string" == typeof f[g] ? f[g] = function(a) {
                    return function(b) {
                      return b.tagName == a.toUpperCase()
                    }
                  } (f[g]) : "function" != typeof f[g] && (f[g] = function(a) {
                    return null
                  });
                  var h = this,
                    i = b({
                      level: -1,
                      title: "root"
                    }),
                    j = i;
                  return e(h.body, i),
                    i
                },
                notNeedUndo: !0
              },
              movesection: {
                execCommand: function(a, b, d, e) {
                  function f(a, b, c) {
                    for (var d = !1,
                           e = !1,
                           f = 0; f < a.length && !(f >= c.length); f++) {
                      if (c[f] > a[f]) {
                        d = !0;
                        break
                      }
                      if (c[f] < a[f]) break
                    }
                    for (var f = 0; f < b.length && !(f >= c.length); f++) {
                      if (c[f] < a[f]) {
                        e = !0;
                        break
                      }
                      if (c[f] > a[f]) break
                    }
                    return d && e
                  }
                  var g, h, i = this;
                  if (b && d && d.level != -1 && (g = e ? d.endAddress: d.startAddress, h = c(g, i.body), g && h && !f(b.startAddress, b.endAddress, g))) {
                    var j, k, l = c(b.startAddress, i.body),
                      m = c(b.endAddress, i.body);
                    if (e) for (j = m; j && !(domUtils.getPosition(l, j) & domUtils.POSITION_FOLLOWING) && (k = j.previousSibling, domUtils.insertAfter(h, j), j != l);) j = k;
                    else for (j = l; j && !(domUtils.getPosition(j, m) & domUtils.POSITION_FOLLOWING) && (k = j.nextSibling, h.parentNode.insertBefore(j, h), j != m);) j = k;
                    i.fireEvent("updateSections")
                  }
                }
              },
              deletesection: {
                execCommand: function(a, b, c) {
                  function d(a) {
                    for (var b = e.body,
                           c = 0; c < a.length; c++) {
                      if (!b.childNodes) return null;
                      b = b.childNodes[a[c]]
                    }
                    return b
                  }
                  var e = this;
                  if (b) {
                    var f, g = d(b.startAddress),
                      h = d(b.endAddress),
                      i = g;
                    if (c) domUtils.remove(i);
                    else for (; i && domUtils.inDoc(h, e.document) && !(domUtils.getPosition(i, h) & domUtils.POSITION_FOLLOWING);) f = i.nextSibling,
                      domUtils.remove(i),
                      i = f;
                    e.fireEvent("updateSections")
                  }
                }
              },
              selectsection: {
                execCommand: function(a, b) {
                  if (!b && !b.dom) return ! 1;
                  var c = this,
                    d = c.selection.getRange(),
                    e = {
                      startAddress: utils.clone(b.startAddress, []),
                      endAddress: utils.clone(b.endAddress, [])
                    };
                  return e.endAddress[e.endAddress.length - 1]++,
                    d.moveToAddress(e).select().scrollToView(),
                    !0
                },
                notNeedUndo: !0
              },
              scrolltosection: {
                execCommand: function(a, b) {
                  if (!b && !b.dom) return ! 1;
                  var c = this,
                    d = c.selection.getRange(),
                    e = {
                      startAddress: b.startAddress,
                      endAddress: b.endAddress
                    };
                  return e.endAddress[e.endAddress.length - 1]++,
                    d.moveToAddress(e).scrollToView(),
                    !0
                },
                notNeedUndo: !0
              }
            }
          }
        }),
      UE.plugin.register("simpleupload",
        function() {
          function a() {
            var a = b.offsetWidth || 20,
              e = b.offsetHeight || 20,
              f = document.createElement("iframe"),
              g = "display:block;width:" + a + "px;height:" + e + "px;overflow:hidden;border:0;margin:0;padding:0;position:absolute;top:0;left:0;filter:alpha(opacity=0);-moz-opacity:0;-khtml-opacity: 0;opacity: 0;cursor:pointer;";
            domUtils.on(f, "load",
              function() {
                var b, h, i, j = ( + new Date).toString(36);
                h = f.contentDocument || f.contentWindow.document,
                  i = h.body,
                  b = h.createElement("div"),
                  b.innerHTML = '<form id="edui_form_' + j + '" target="edui_iframe_' + j + '" method="POST" enctype="multipart/form-data" action="' + c.getOpt("serverUrl") + '" style="' + g + '"><input id="edui_input_' + j + '" type="file" accept="image/*" name="' + c.options.imageFieldName + '" style="' + g + '"></form><iframe id="edui_iframe_' + j + '" name="edui_iframe_' + j + '" style="display:none;width:0;height:0;border:0;margin:0;padding:0;position:absolute;"></iframe>',
                  b.className = "edui-" + c.options.theme,
                  b.id = c.ui.id + "_iframeupload",
                  i.style.cssText = g,
                  i.style.width = a + "px",
                  i.style.height = e + "px",
                  i.appendChild(b),
                i.parentNode && (i.parentNode.style.width = a + "px", i.parentNode.style.height = a + "px");
                var k = h.getElementById("edui_form_" + j),
                  l = h.getElementById("edui_input_" + j),
                  m = h.getElementById("edui_iframe_" + j);
                domUtils.on(l, "change",
                  function() {
                    function a() {
                      try {
                        var e, f, g, h = (m.contentDocument || m.contentWindow.document).body,
                          i = h.innerText || h.textContent || "";
                        f = new Function("return " + i)(),
                          e = c.options.imageUrlPrefix + f.url,
                          "SUCCESS" == f.state && f.url ? (g = c.document.getElementById(d), g.setAttribute("src", e), g.setAttribute("_src", e), g.setAttribute("title", f.title || ""), g.setAttribute("alt", f.original || ""), g.removeAttribute("id"), domUtils.removeClasses(g, "loadingclass")) : b && b(f.state)
                      } catch(j) {
                        b && b(c.getLang("simpleupload.loadError"))
                      }
                      k.reset(),
                        domUtils.un(m, "load", a)
                    }
                    function b(a) {
                      if (d) {
                        var b = c.document.getElementById(d);
                        b && domUtils.remove(b),
                          c.fireEvent("showmessage", {
                            id: d,
                            content: a,
                            type: "error",
                            timeout: 4e3
                          })
                      }
                    }
                    if (l.value) {
                      var d = "loading_" + ( + new Date).toString(36),
                        e = utils.serializeParam(c.queryCommandValue("serverparam")) || "",
                        f = c.getActionUrl(c.getOpt("imageActionName")),
                        g = c.getOpt("imageAllowFiles");
                      if (c.focus(), c.execCommand("inserthtml", '<img class="loadingclass" id="' + d + '" src="' + c.options.themePath + c.options.theme + '/images/spacer.gif" title="' + (c.getLang("simpleupload.loading") || "") + '" >'), !c.getOpt("imageActionName")) return void errorHandler(c.getLang("autoupload.errorLoadConfig"));
                      var h = l.value,
                        i = h ? h.substr(h.lastIndexOf(".")) : "";
                      if (!i || g && (g.join("") + ".").indexOf(i.toLowerCase() + ".") == -1) return void b(c.getLang("simpleupload.exceedTypeError"));
                      domUtils.on(m, "load", a),
                        k.action = utils.formatUrl(f + (f.indexOf("?") == -1 ? "?": "&") + e),
                        k.submit()
                    }
                  });
                var n;
                c.addListener("selectionchange",
                  function() {
                    clearTimeout(n),
                      n = setTimeout(function() {
                          var a = c.queryCommandState("simpleupload");
                          a == -1 ? l.disabled = "disabled": l.disabled = !1
                        },
                        400)
                  }),
                  d = !0
              }),
              f.style.cssText = g,
              b.appendChild(f)
          }
          var b, c = this,
            d = !1;
          return {
            bindEvents: {
              ready: function() {
                utils.cssRule("loading", ".loadingclass{display:inline-block;cursor:default;background: url('" + this.options.themePath + this.options.theme + "/images/loading.gif') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}\n.loaderrorclass{display:inline-block;cursor:default;background: url('" + this.options.themePath + this.options.theme + "/images/loaderror.png') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}", this.document)
              },
              simpleuploadbtnready: function(d, e) {
                b = e,
                  c.afterConfigReady(a)
              }
            },
            outputRule: function(a) {
              utils.each(a.getNodesByTagName("img"),
                function(a) { / \b(loaderrorclass) | (bloaderrorclass)\b / .test(a.getAttr("class")) && a.parentNode.removeChild(a)
                })
            },
            commands: {
              simpleupload: {
                queryCommandState: function() {
                  return d ? 0 : -1
                }
              }
            }
          }
        }),
      UE.plugin.register("serverparam",
        function() {
          var a = {};
          return {
            commands: {
              serverparam: {
                execCommand: function(b, c, d) {
                  void 0 === c || null === c ? a = {}: utils.isString(c) ? void 0 === d || null === d ? delete a[c] : a[c] = d: utils.isObject(c) ? utils.extend(a, c, !0) : utils.isFunction(c) && utils.extend(a, c(), !0)
                },
                queryCommandValue: function() {
                  return a || {}
                }
              }
            }
          }
        }),
      UE.plugin.register("insertfile",
        function() {
          function a(a) {
            var b = a.substr(a.lastIndexOf(".") + 1).toLowerCase(),
              c = {
                rar: "icon_rar.gif",
                zip: "icon_rar.gif",
                tar: "icon_rar.gif",
                gz: "icon_rar.gif",
                bz2: "icon_rar.gif",
                doc: "icon_doc.gif",
                docx: "icon_doc.gif",
                pdf: "icon_pdf.gif",
                mp3: "icon_mp3.gif",
                xls: "icon_xls.gif",
                chm: "icon_chm.gif",
                ppt: "icon_ppt.gif",
                pptx: "icon_ppt.gif",
                avi: "icon_mv.gif",
                rmvb: "icon_mv.gif",
                wmv: "icon_mv.gif",
                flv: "icon_mv.gif",
                swf: "icon_mv.gif",
                rm: "icon_mv.gif",
                exe: "icon_exe.gif",
                psd: "icon_psd.gif",
                txt: "icon_txt.gif",
                jpg: "icon_jpg.gif",
                png: "icon_jpg.gif",
                jpeg: "icon_jpg.gif",
                gif: "icon_jpg.gif",
                ico: "icon_jpg.gif",
                bmp: "icon_jpg.gif"
              };
            return c[b] ? c[b] : c.txt
          }
          var b = this;
          return {
            commands: {
              insertfile: {
                execCommand: function(c, d) {
                  d = utils.isArray(d) ? d: [d];
                  var e, f, g, h, i = "",
                    j = b.getOpt("UEDITOR_HOME_URL"),
                    k = j + ("/" == j.substr(j.length - 1) ? "": "/") + "dialogs/attachment/fileTypeImages/";
                  for (e = 0; e < d.length; e++) f = d[e],
                    g = k + a(f.url),
                    h = f.title || f.url.substr(f.url.lastIndexOf("/") + 1),
                    i += '<p style="line-height: 16px;"><img style="vertical-align: middle; margin-right: 2px;" src="' + g + '" _src="' + g + '" /><a style="font-size:12px; color:#0066cc;" href="' + f.url + '" title="' + h + '">' + h + "</a></p>";
                  b.execCommand("insertHtml", i)
                }
              }
            }
          }
        }),
      UE.plugins.xssFilter = function() {
        function a(a) {
          var b = a.tagName,
            d = a.attrs;
          return c.hasOwnProperty(b) ? void UE.utils.each(d,
            function(d, e) {
              c[b].indexOf(e) === -1 && a.setAttr(e)
            }) : (a.parentNode.removeChild(a), !1)
        }
        var b = UEDITOR_CONFIG,
          c = b.whitList;
        c && b.xssFilterRules && (this.options.filterRules = function() {
          var b = {};
          return UE.utils.each(c,
            function(c, d) {
              b[d] = function(b) {
                return a(b)
              }
            }),
            b
        } ());
        var d = [];
        UE.utils.each(c,
          function(a, b) {
            d.push(b)
          }),
        c && b.inputXssFilter && this.addInputRule(function(b) {
          b.traversal(function(b) {
            return "element" === b.type && void a(b)
          })
        }),
        c && b.outputXssFilter && this.addOutputRule(function(b) {
          b.traversal(function(b) {
            return "element" === b.type && void a(b)
          })
        })
      };
    var baidu = baidu || {};
    baidu.editor = baidu.editor || {},
      UE.ui = baidu.editor.ui = {},
      function() {
        function a() {
          var a = document.getElementById("edui_fixedlayer");
          i.setViewportOffset(a, {
            left: 0,
            top: 0
          })
        }
        function b(b) {
          d.on(window, "scroll", a),
            d.on(window, "resize", baidu.editor.utils.defer(a, 0, !0))
        }
        var c = baidu.editor.browser,
          d = baidu.editor.dom.domUtils,
          e = "$EDITORUI",
          f = window[e] = {},
          g = "ID" + e,
          h = 0,
          i = baidu.editor.ui.uiUtils = {
            uid: function(a) {
              return a ? a[g] || (a[g] = ++h) : ++h
            },
            hook: function(a, b) {
              var c;
              return a && a._callbacks ? c = a: (c = function() {
                var b;
                a && (b = a.apply(this, arguments));
                for (var d = c._callbacks,
                       e = d.length; e--;) {
                  var f = d[e].apply(this, arguments);
                  void 0 === b && (b = f)
                }
                return b
              },
                c._callbacks = []),
                c._callbacks.push(b),
                c
            },
            createElementByHtml: function(a) {
              var b = document.createElement("div");
              return b.innerHTML = a,
                b = b.firstChild,
                b.parentNode.removeChild(b),
                b
            },
            getViewportElement: function() {
              return c.ie && c.quirks ? document.body: document.documentElement
            },
            getClientRect: function(a) {
              var b;
              try {
                b = a.getBoundingClientRect()
              } catch(c) {
                b = {
                  left: 0,
                  top: 0,
                  height: 0,
                  width: 0
                }
              }
              for (var e, f = {
                left: Math.round(b.left),
                top: Math.round(b.top),
                height: Math.round(b.bottom - b.top),
                width: Math.round(b.right - b.left)
              }; (e = a.ownerDocument) !== document && (a = d.getWindow(e).frameElement);) b = a.getBoundingClientRect(),
                f.left += b.left,
                f.top += b.top;
              return f.bottom = f.top + f.height,
                f.right = f.left + f.width,
                f
            },
            getViewportRect: function() {
              var a = i.getViewportElement(),
                b = 0 | (window.innerWidth || a.clientWidth),
                c = 0 | (window.innerHeight || a.clientHeight);
              return {
                left: 0,
                top: 0,
                height: c,
                width: b,
                bottom: c,
                right: b
              }
            },
            setViewportOffset: function(a, b) {
              var c = i.getFixedLayer();
              a.parentNode === c ? (a.style.left = b.left + "px", a.style.top = b.top + "px") : d.setViewportOffset(a, b)
            },
            getEventOffset: function(a) {
              var b = a.target || a.srcElement,
                c = i.getClientRect(b),
                d = i.getViewportOffsetByEvent(a);
              return {
                left: d.left - c.left,
                top: d.top - c.top
              }
            },
            getViewportOffsetByEvent: function(a) {
              var b = a.target || a.srcElement,
                c = d.getWindow(b).frameElement,
                e = {
                  left: a.clientX,
                  top: a.clientY
                };
              if (c && b.ownerDocument !== document) {
                var f = i.getClientRect(c);
                e.left += f.left,
                  e.top += f.top
              }
              return e
            },
            setGlobal: function(a, b) {
              return f[a] = b,
              e + '["' + a + '"]'
            },
            unsetGlobal: function(a) {
              delete f[a]
            },
            copyAttributes: function(a, b) {
              for (var e = b.attributes,
                     f = e.length; f--;) {
                var g = e[f];
                "style" == g.nodeName || "class" == g.nodeName || c.ie && !g.specified || a.setAttribute(g.nodeName, g.nodeValue)
              }
              b.className && d.addClass(a, b.className),
              b.style.cssText && (a.style.cssText += ";" + b.style.cssText)
            },
            removeStyle: function(a, b) {
              if (a.style.removeProperty) a.style.removeProperty(b);
              else {
                if (!a.style.removeAttribute) throw "";
                a.style.removeAttribute(b)
              }
            },
            contains: function(a, b) {
              return a && b && a !== b && (a.contains ? a.contains(b) : 16 & a.compareDocumentPosition(b))
            },
            startDrag: function(a, b, c) {
              function d(a) {
                var c = a.clientX - g,
                  d = a.clientY - h;
                b.ondragmove(c, d, a),
                  a.stopPropagation ? a.stopPropagation() : a.cancelBubble = !0
              }
              function e(a) {
                c.removeEventListener("mousemove", d, !0),
                  c.removeEventListener("mouseup", e, !0),
                  window.removeEventListener("mouseup", e, !0),
                  b.ondragstop()
              }
              function f() {
                i.releaseCapture(),
                  i.detachEvent("onmousemove", d),
                  i.detachEvent("onmouseup", f),
                  i.detachEvent("onlosecaptrue", f),
                  b.ondragstop()
              }
              var c = c || document,
                g = a.clientX,
                h = a.clientY;
              if (c.addEventListener) c.addEventListener("mousemove", d, !0),
                c.addEventListener("mouseup", e, !0),
                window.addEventListener("mouseup", e, !0),
                a.preventDefault();
              else {
                var i = a.srcElement;
                i.setCapture(),
                  i.attachEvent("onmousemove", d),
                  i.attachEvent("onmouseup", f),
                  i.attachEvent("onlosecaptrue", f),
                  a.returnValue = !1
              }
              b.ondragstart()
            },
            getFixedLayer: function() {
              var d = document.getElementById("edui_fixedlayer");
              return null == d && (d = document.createElement("div"), d.id = "edui_fixedlayer", document.body.appendChild(d), c.ie && c.version <= 8 ? (d.style.position = "absolute", b(), setTimeout(a)) : d.style.position = "fixed", d.style.left = "0", d.style.top = "0", d.style.width = "0", d.style.height = "0"),
                d
            },
            makeUnselectable: function(a) {
              if (c.opera || c.ie && c.version < 9) {
                if (a.unselectable = "on", a.hasChildNodes()) for (var b = 0; b < a.childNodes.length; b++) 1 == a.childNodes[b].nodeType && i.makeUnselectable(a.childNodes[b])
              } else void 0 !== a.style.MozUserSelect ? a.style.MozUserSelect = "none": void 0 !== a.style.WebkitUserSelect ? a.style.WebkitUserSelect = "none": void 0 !== a.style.KhtmlUserSelect && (a.style.KhtmlUserSelect = "none")
            }
          }
      } (),
      function() {
        var a = baidu.editor.utils,
          b = baidu.editor.ui.uiUtils,
          c = baidu.editor.EventBase,
          d = baidu.editor.ui.UIBase = function() {};
        d.prototype = {
          className: "",
          uiName: "",
          initOptions: function(a) {
            var c = this;
            for (var d in a) c[d] = a[d];
            this.id = this.id || "edui" + b.uid()
          },
          initUIBase: function() {
            this._globalKey = a.unhtml(b.setGlobal(this.id, this))
          },
          render: function(a) {
            for (var c, d = this.renderHtml(), e = b.createElementByHtml(d), f = domUtils.getElementsByTagName(e, "*"), g = "edui-" + (this.theme || this.editor.options.theme), h = document.getElementById("edui_fixedlayer"), i = 0; c = f[i++];) domUtils.addClass(c, g);
            domUtils.addClass(e, g),
            h && (h.className = "", domUtils.addClass(h, g));
            var j = this.getDom();
            null != j ? (j.parentNode.replaceChild(e, j), b.copyAttributes(e, j)) : ("string" == typeof a && (a = document.getElementById(a)), a = a || b.getFixedLayer(), domUtils.addClass(a, g), a.appendChild(e)),
              this.postRender()
          },
          getDom: function(a) {
            return a ? document.getElementById(this.id + "_" + a) : document.getElementById(this.id)
          },
          postRender: function() {
            this.fireEvent("postrender")
          },
          getHtmlTpl: function() {
            return ""
          },
          formatHtml: function(a) {
            var b = "edui-" + this.uiName;
            return a.replace(/##/g, this.id).replace(/%%-/g, this.uiName ? b + "-": "").replace(/%%/g, (this.uiName ? b: "") + " " + this.className).replace(/\$\$/g, this._globalKey)
          },
          renderHtml: function() {
            return this.formatHtml(this.getHtmlTpl())
          },
          dispose: function() {
            var a = this.getDom();
            a && baidu.editor.dom.domUtils.remove(a),
              b.unsetGlobal(this.id)
          }
        },
          a.inherits(d, c)
      } (),
      function() {
        var a = baidu.editor.utils,
          b = baidu.editor.ui.UIBase,
          c = baidu.editor.ui.Separator = function(a) {
            this.initOptions(a),
              this.initSeparator()
          };
        c.prototype = {
          uiName: "separator",
          initSeparator: function() {
            this.initUIBase()
          },
          getHtmlTpl: function() {
            return '<div id="##" class="edui-box %%"></div>'
          }
        },
          a.inherits(c, b)
      } (),
      function() {
        var a = baidu.editor.utils,
          b = baidu.editor.dom.domUtils,
          c = baidu.editor.ui.UIBase,
          d = baidu.editor.ui.uiUtils,
          e = baidu.editor.ui.Mask = function(a) {
            this.initOptions(a),
              this.initUIBase()
          };
        e.prototype = {
          getHtmlTpl: function() {
            return '<div id="##" class="edui-mask %%" onclick="return $$._onClick(event, this);" onmousedown="return $$._onMouseDown(event, this);"></div>'
          },
          postRender: function() {
            var a = this;
            b.on(window, "resize",
              function() {
                setTimeout(function() {
                  a.isHidden() || a._fill()
                })
              })
          },
          show: function(a) {
            this._fill(),
              this.getDom().style.display = "",
              this.getDom().style.zIndex = a
          },
          hide: function() {
            this.getDom().style.display = "none",
              this.getDom().style.zIndex = ""
          },
          isHidden: function() {
            return "none" == this.getDom().style.display
          },
          _onMouseDown: function() {
            return ! 1
          },
          _onClick: function(a, b) {
            this.fireEvent("click", a, b)
          },
          _fill: function() {
            var a = this.getDom(),
              b = d.getViewportRect();
            a.style.width = b.width + "px",
              a.style.height = b.height + "px"
          }
        },
          a.inherits(e, c)
      } (),
      function() {
        function a(a, b) {
          for (var c = 0; c < g.length; c++) {
            var d = g[c];
            if (!d.isHidden() && d.queryAutoHide(b) !== !1) {
              if (a && /scroll/gi.test(a.type) && "edui-wordpastepop" == d.className) return;
              d.hide()
            }
          }
          g.length && d.editor.fireEvent("afterhidepop")
        }
        var b = baidu.editor.utils,
          c = baidu.editor.ui.uiUtils,
          d = baidu.editor.dom.domUtils,
          e = baidu.editor.ui.UIBase,
          f = baidu.editor.ui.Popup = function(a) {
            this.initOptions(a),
              this.initPopup()
          },
          g = [];
        f.postHide = a;
        var h = ["edui-anchor-topleft", "edui-anchor-topright", "edui-anchor-bottomleft", "edui-anchor-bottomright"];
        f.prototype = {
          SHADOW_RADIUS: 5,
          content: null,
          _hidden: !1,
          autoRender: !0,
          canSideLeft: !0,
          canSideUp: !0,
          initPopup: function() {
            this.initUIBase(),
              g.push(this)
          },
          getHtmlTpl: function() {
            return '<div id="##" class="edui-popup %%" onmousedown="return false;"> <div id="##_body" class="edui-popup-body"> <iframe style="position:absolute;z-index:-1;left:0;top:0;background-color: transparent;" frameborder="0" width="100%" height="100%" src="about:blank"></iframe> <div class="edui-shadow"></div> <div id="##_content" class="edui-popup-content">' + this.getContentHtmlTpl() + "  </div> </div></div>"
          },
          getContentHtmlTpl: function() {
            return this.content ? "string" == typeof this.content ? this.content: this.content.renderHtml() : ""
          },
          _UIBase_postRender: e.prototype.postRender,
          postRender: function() {
            if (this.content instanceof e && this.content.postRender(), this.captureWheel && !this.captured) {
              this.captured = !0;
              var a = (document.documentElement.clientHeight || document.body.clientHeight) - 80,
                b = this.getDom().offsetHeight,
                f = c.getClientRect(this.combox.getDom()).top,
                g = this.getDom("content"),
                h = this.getDom("body").getElementsByTagName("iframe"),
                i = this;
              for (h.length && (h = h[0]); f + b > a;) b -= 30;
              g.style.height = b + "px",
              h && (h.style.height = b + "px"),
                window.XMLHttpRequest ? d.on(g, "onmousewheel" in document.body ? "mousewheel": "DOMMouseScroll",
                  function(a) {
                    a.preventDefault ? a.preventDefault() : a.returnValue = !1,
                      a.wheelDelta ? g.scrollTop -= a.wheelDelta / 120 * 60 : g.scrollTop -= a.detail / -3 * 60
                  }) : d.on(this.getDom(), "mousewheel",
                  function(a) {
                    a.returnValue = !1,
                      i.getDom("content").scrollTop -= a.wheelDelta / 120 * 60
                  })
            }
            this.fireEvent("postRenderAfter"),
              this.hide(!0),
              this._UIBase_postRender()
          },
          _doAutoRender: function() { ! this.getDom() && this.autoRender && this.render()
          },
          mesureSize: function() {
            var a = this.getDom("content");
            return c.getClientRect(a)
          },
          fitSize: function() {
            if (this.captureWheel && this.sized) return this.__size;
            this.sized = !0;
            var a = this.getDom("body");
            a.style.width = "",
              a.style.height = "";
            var b = this.mesureSize();
            if (this.captureWheel) {
              a.style.width = -( - 20 - b.width) + "px";
              var c = parseInt(this.getDom("content").style.height, 10); ! window.isNaN(c) && (b.height = c)
            } else a.style.width = b.width + "px";
            return a.style.height = b.height + "px",
              this.__size = b,
            this.captureWheel && (this.getDom("content").style.overflow = "auto"),
              b
          },
          showAnchor: function(a, b) {
            this.showAnchorRect(c.getClientRect(a), b)
          },
          showAnchorRect: function(a, b, e) {
            this._doAutoRender();
            var f = c.getViewportRect();
            this.getDom().style.visibility = "hidden",
              this._show();
            var g, i, j, k, l = this.fitSize();
            b ? (g = this.canSideLeft && a.right + l.width > f.right && a.left > l.width, i = this.canSideUp && a.top + l.height > f.bottom && a.bottom > l.height, j = g ? a.left - l.width: a.right, k = i ? a.bottom - l.height: a.top) : (g = this.canSideLeft && a.right + l.width > f.right && a.left > l.width, i = this.canSideUp && a.top + l.height > f.bottom && a.bottom > l.height, j = g ? a.right - l.width: a.left, k = i ? a.top - l.height: a.bottom);
            var m = this.getDom();
            c.setViewportOffset(m, {
              left: j,
              top: k
            }),
              d.removeClasses(m, h),
              m.className += " " + h[2 * (i ? 1 : 0) + (g ? 1 : 0)],
            this.editor && (m.style.zIndex = 1 * this.editor.container.style.zIndex + 10, baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex = m.style.zIndex - 1),
              this.getDom().style.visibility = "visible"
          },
          showAt: function(a) {
            var b = a.left,
              c = a.top,
              d = {
                left: b,
                top: c,
                right: b,
                bottom: c,
                height: 0,
                width: 0
              };
            this.showAnchorRect(d, !1, !0)
          },
          _show: function() {
            if (this._hidden) {
              var a = this.getDom();
              a.style.display = "",
                this._hidden = !1,
                this.fireEvent("show")
            }
          },
          isHidden: function() {
            return this._hidden
          },
          show: function() {
            this._doAutoRender(),
              this._show()
          },
          hide: function(a) { ! this._hidden && this.getDom() && (this.getDom().style.display = "none", this._hidden = !0, a || this.fireEvent("hide"))
          },
          queryAutoHide: function(a) {
            return ! a || !c.contains(this.getDom(), a)
          }
        },
          b.inherits(f, e),
          d.on(document, "mousedown",
            function(b) {
              var c = b.target || b.srcElement;
              a(b, c)
            }),
          d.on(window, "scroll",
            function(b, c) {
              a(b, c)
            })
      } (),
      function() {
        function a(a, b) {
          for (var c = '<div id="##" class="edui-colorpicker %%"><div class="edui-colorpicker-topbar edui-clearfix"><div unselectable="on" id="##_preview" class="edui-colorpicker-preview"></div><div unselectable="on" class="edui-colorpicker-nocolor" onclick="$$._onPickNoColor(event, this);">' + a + '</div></div><table  class="edui-box" style="border-collapse: collapse;" onmouseover="$$._onTableOver(event, this);" onmouseout="$$._onTableOut(event, this);" onclick="return $$._onTableClick(event, this);" cellspacing="0" cellpadding="0"><tr style="border-bottom: 1px solid #ddd;font-size: 13px;line-height: 25px;color:#39C;padding-top: 2px"><td colspan="10">' + b.getLang("themeColor") + '</td> </tr><tr class="edui-colorpicker-tablefirstrow" >', d = 0; d < e.length; d++) d && d % 10 === 0 && (c += "</tr>" + (60 == d ? '<tr style="border-bottom: 1px solid #ddd;font-size: 13px;line-height: 25px;color:#39C;"><td colspan="10">' + b.getLang("standardColor") + "</td></tr>": "") + "<tr" + (60 == d ? ' class="edui-colorpicker-tablefirstrow"': "") + ">"),
            c += d < 70 ? '<td style="padding: 0 2px;"><a hidefocus title="' + e[d] + '" onclick="return false;" href="javascript:" unselectable="on" class="edui-box edui-colorpicker-colorcell" data-color="#' + e[d] + '" style="background-color:#' + e[d] + ";border:solid #ccc;" + (d < 10 || d >= 60 ? "border-width:1px;": d >= 10 && d < 20 ? "border-width:1px 1px 0 1px;": "border-width:0 1px 0 1px;") + '"></a></td>': "";
          return c += "</tr></table></div>"
        }
        var b = baidu.editor.utils,
          c = baidu.editor.ui.UIBase,
          d = baidu.editor.ui.ColorPicker = function(a) {
            this.initOptions(a),
              this.noColorText = this.noColorText || this.editor.getLang("clearColor"),
              this.initUIBase()
          };
        d.prototype = {
          getHtmlTpl: function() {
            return a(this.noColorText, this.editor)
          },
          _onTableClick: function(a) {
            var b = a.target || a.srcElement,
              c = b.getAttribute("data-color");
            c && this.fireEvent("pickcolor", c)
          },
          _onTableOver: function(a) {
            var b = a.target || a.srcElement,
              c = b.getAttribute("data-color");
            c && (this.getDom("preview").style.backgroundColor = c)
          },
          _onTableOut: function() {
            this.getDom("preview").style.backgroundColor = ""
          },
          _onPickNoColor: function() {
            this.fireEvent("picknocolor")
          }
        },
          b.inherits(d, c);
        var e = "ffffff,000000,eeece1,1f497d,4f81bd,c0504d,9bbb59,8064a2,4bacc6,f79646,f2f2f2,7f7f7f,ddd9c3,c6d9f0,dbe5f1,f2dcdb,ebf1dd,e5e0ec,dbeef3,fdeada,d8d8d8,595959,c4bd97,8db3e2,b8cce4,e5b9b7,d7e3bc,ccc1d9,b7dde8,fbd5b5,bfbfbf,3f3f3f,938953,548dd4,95b3d7,d99694,c3d69b,b2a2c7,92cddc,fac08f,a5a5a5,262626,494429,17365d,366092,953734,76923c,5f497a,31859b,e36c09,7f7f7f,0c0c0c,1d1b10,0f243e,244061,632423,4f6128,3f3151,205867,974806,c00000,ff0000,ffc000,ffff00,92d050,00b050,00b0f0,0070c0,002060,7030a0,".split(",")
      } (),
      function() {
        var a = baidu.editor.utils,
          b = baidu.editor.ui.uiUtils,
          c = baidu.editor.ui.UIBase,
          d = baidu.editor.ui.TablePicker = function(a) {
            this.initOptions(a),
              this.initTablePicker()
          };
        d.prototype = {
          defaultNumRows: 10,
          defaultNumCols: 10,
          maxNumRows: 20,
          maxNumCols: 20,
          numRows: 10,
          numCols: 10,
          lengthOfCellSide: 22,
          initTablePicker: function() {
            this.initUIBase()
          },
          getHtmlTpl: function() {
            return '<div id="##" class="edui-tablepicker %%"><div class="edui-tablepicker-body"><div class="edui-infoarea"><span id="##_label" class="edui-label"></span></div><div class="edui-pickarea" onmousemove="$$._onMouseMove(event, this);" onmouseover="$$._onMouseOver(event, this);" onmouseout="$$._onMouseOut(event, this);" onclick="$$._onClick(event, this);"><div id="##_overlay" class="edui-overlay"></div></div></div></div>'
          },
          _UIBase_render: c.prototype.render,
          render: function(a) {
            this._UIBase_render(a),
              this.getDom("label").innerHTML = "0" + this.editor.getLang("t_row") + " x 0" + this.editor.getLang("t_col")
          },
          _track: function(a, b) {
            var c = this.getDom("overlay").style,
              d = this.lengthOfCellSide;
            c.width = a * d + "px",
              c.height = b * d + "px";
            var e = this.getDom("label");
            e.innerHTML = a + this.editor.getLang("t_col") + " x " + b + this.editor.getLang("t_row"),
              this.numCols = a,
              this.numRows = b
          },
          _onMouseOver: function(a, c) {
            var d = a.relatedTarget || a.fromElement;
            b.contains(c, d) || c === d || (this.getDom("label").innerHTML = "0" + this.editor.getLang("t_col") + " x 0" + this.editor.getLang("t_row"), this.getDom("overlay").style.visibility = "")
          },
          _onMouseOut: function(a, c) {
            var d = a.relatedTarget || a.toElement;
            b.contains(c, d) || c === d || (this.getDom("label").innerHTML = "0" + this.editor.getLang("t_col") + " x 0" + this.editor.getLang("t_row"), this.getDom("overlay").style.visibility = "hidden")
          },
          _onMouseMove: function(a, c) {
            var d = (this.getDom("overlay").style, b.getEventOffset(a)),
              e = this.lengthOfCellSide,
              f = Math.ceil(d.left / e),
              g = Math.ceil(d.top / e);
            this._track(f, g)
          },
          _onClick: function() {
            this.fireEvent("picktable", this.numCols, this.numRows)
          }
        },
          a.inherits(d, c)
      } (),
      function() {
        var a = baidu.editor.browser,
          b = baidu.editor.dom.domUtils,
          c = baidu.editor.ui.uiUtils,
          d = 'onmousedown="$$.Stateful_onMouseDown(event, this);" onmouseup="$$.Stateful_onMouseUp(event, this);"' + (a.ie ? ' onmouseenter="$$.Stateful_onMouseEnter(event, this);" onmouseleave="$$.Stateful_onMouseLeave(event, this);"': ' onmouseover="$$.Stateful_onMouseOver(event, this);" onmouseout="$$.Stateful_onMouseOut(event, this);"');
        baidu.editor.ui.Stateful = {
          alwalysHoverable: !1,
          target: null,
          Stateful_init: function() {
            this._Stateful_dGetHtmlTpl = this.getHtmlTpl,
              this.getHtmlTpl = this.Stateful_getHtmlTpl
          },
          Stateful_getHtmlTpl: function() {
            var a = this._Stateful_dGetHtmlTpl();
            return a.replace(/stateful/g,
              function() {
                return d
              })
          },
          Stateful_onMouseEnter: function(a, b) {
            this.target = b,
            this.isDisabled() && !this.alwalysHoverable || (this.addState("hover"), this.fireEvent("over"))
          },
          Stateful_onMouseLeave: function(a, b) {
            this.isDisabled() && !this.alwalysHoverable || (this.removeState("hover"), this.removeState("active"), this.fireEvent("out"))
          },
          Stateful_onMouseOver: function(a, b) {
            var d = a.relatedTarget;
            c.contains(b, d) || b === d || this.Stateful_onMouseEnter(a, b)
          },
          Stateful_onMouseOut: function(a, b) {
            var d = a.relatedTarget;
            c.contains(b, d) || b === d || this.Stateful_onMouseLeave(a, b)
          },
          Stateful_onMouseDown: function(a, b) {
            this.isDisabled() || this.addState("active")
          },
          Stateful_onMouseUp: function(a, b) {
            this.isDisabled() || this.removeState("active")
          },
          Stateful_postRender: function() {
            this.disabled && !this.hasState("disabled") && this.addState("disabled")
          },
          hasState: function(a) {
            return b.hasClass(this.getStateDom(), "edui-state-" + a)
          },
          addState: function(a) {
            this.hasState(a) || (this.getStateDom().className += " edui-state-" + a)
          },
          removeState: function(a) {
            this.hasState(a) && b.removeClasses(this.getStateDom(), ["edui-state-" + a])
          },
          getStateDom: function() {
            return this.getDom("state")
          },
          isChecked: function() {
            return this.hasState("checked")
          },
          setChecked: function(a) { ! this.isDisabled() && a ? this.addState("checked") : this.removeState("checked")
          },
          isDisabled: function() {
            return this.hasState("disabled")
          },
          setDisabled: function(a) {
            a ? (this.removeState("hover"), this.removeState("checked"), this.removeState("active"), this.addState("disabled")) : this.removeState("disabled")
          }
        }
      } (),
      function() {
        var a = baidu.editor.utils,
          b = baidu.editor.ui.UIBase,
          c = baidu.editor.ui.Stateful,
          d = baidu.editor.ui.Button = function(a) {
            if (a.name) {
              var b = a.name,
                c = a.cssRules;
              a.className || (a.className = "edui-for-" + b),
                a.cssRules = ".edui-default  .edui-for-" + b + " .edui-icon {" + c + "}"
            }
            this.initOptions(a),
              this.initButton()
          };
        d.prototype = {
          uiName: "button",
          label: "",
          title: "",
          showIcon: !0,
          showText: !0,
          cssRules: "",
          initButton: function() {
            this.initUIBase(),
              this.Stateful_init(),
            this.cssRules && a.cssRule("edui-customize-" + this.name + "-style", this.cssRules)
          },
          getHtmlTpl: function() {
            return '<div id="##" class="edui-box %%"><div id="##_state" stateful><div class="%%-wrap"><div id="##_body" unselectable="on" ' + (this.title ? 'title="' + this.title + '"': "") + ' class="%%-body" onmousedown="return $$._onMouseDown(event, this);" onclick="return $$._onClick(event, this);">' + (this.showIcon ? '<div class="edui-box edui-icon"></div>': "") + (this.showText ? '<div class="edui-box edui-label">' + this.label + "</div>": "") + "</div></div></div></div>"
          },
          postRender: function() {
            this.Stateful_postRender(),
              this.setDisabled(this.disabled)
          },
          _onMouseDown: function(a) {
            var b = a.target || a.srcElement,
              c = b && b.tagName && b.tagName.toLowerCase();
            if ("input" == c || "object" == c || "object" == c) return ! 1
          },
          _onClick: function() {
            this.isDisabled() || this.fireEvent("click")
          },
          setTitle: function(a) {
            var b = this.getDom("label");
            b.innerHTML = a
          }
        },
          a.inherits(d, b),
          a.extend(d.prototype, c)
      } (),
      function() {
        var a = baidu.editor.utils,
          b = baidu.editor.ui.uiUtils,
          c = (baidu.editor.dom.domUtils, baidu.editor.ui.UIBase),
          d = baidu.editor.ui.Stateful,
          e = baidu.editor.ui.SplitButton = function(a) {
            this.initOptions(a),
              this.initSplitButton()
          };
        e.prototype = {
          popup: null,
          uiName: "splitbutton",
          title: "",
          initSplitButton: function() {
            this.initUIBase(),
              this.Stateful_init();
            if (null != this.popup) {
              var a = this.popup;
              this.popup = null,
                this.setPopup(a)
            }
          },
          _UIBase_postRender: c.prototype.postRender,
          postRender: function() {
            this.Stateful_postRender(),
              this._UIBase_postRender()
          },
          setPopup: function(c) {
            this.popup !== c && (null != this.popup && this.popup.dispose(), c.addListener("show", a.bind(this._onPopupShow, this)), c.addListener("hide", a.bind(this._onPopupHide, this)), c.addListener("postrender", a.bind(function() {
                c.getDom("body").appendChild(b.createElementByHtml('<div id="' + this.popup.id + '_bordereraser" class="edui-bordereraser edui-background" style="width:' + (b.getClientRect(this.getDom()).width + 20) + 'px"></div>')),
                  c.getDom().className += " " + this.className
              },
              this)), this.popup = c)
          },
          _onPopupShow: function() {
            this.addState("opened")
          },
          _onPopupHide: function() {
            this.removeState("opened")
          },
          getHtmlTpl: function() {
            return '<div id="##" class="edui-box %%"><div ' + (this.title ? 'title="' + this.title + '"': "") + ' id="##_state" stateful><div class="%%-body"><div id="##_button_body" class="edui-box edui-button-body" onclick="$$._onButtonClick(event, this);"><div class="edui-box edui-icon"></div></div><div class="edui-box edui-splitborder"></div><div class="edui-box edui-arrow" onclick="$$._onArrowClick();"></div></div></div></div>'
          },
          showPopup: function() {
            var a = b.getClientRect(this.getDom());
            a.top -= this.popup.SHADOW_RADIUS,
              a.height += this.popup.SHADOW_RADIUS,
              this.popup.showAnchorRect(a)
          },
          _onArrowClick: function(a, b) {
            this.isDisabled() || this.showPopup()
          },
          _onButtonClick: function() {
            this.isDisabled() || this.fireEvent("buttonclick")
          }
        },
          a.inherits(e, c),
          a.extend(e.prototype, d, !0)
      } (),
      function() {
        var a = baidu.editor.utils,
          b = baidu.editor.ui.uiUtils,
          c = baidu.editor.ui.ColorPicker,
          d = baidu.editor.ui.Popup,
          e = baidu.editor.ui.SplitButton,
          f = baidu.editor.ui.ColorButton = function(a) {
            this.initOptions(a),
              this.initColorButton()
          };
        f.prototype = {
          initColorButton: function() {
            var a = this;
            this.popup = new d({
              content: new c({
                noColorText: a.editor.getLang("clearColor"),
                editor: a.editor,
                onpickcolor: function(b, c) {
                  a._onPickColor(c)
                },
                onpicknocolor: function(b, c) {
                  a._onPickNoColor(c)
                }
              }),
              editor: a.editor
            }),
              this.initSplitButton()
          },
          _SplitButton_postRender: e.prototype.postRender,
          postRender: function() {
            this._SplitButton_postRender(),
              this.getDom("button_body").appendChild(b.createElementByHtml('<div id="' + this.id + '_colorlump" class="edui-colorlump"></div>')),
              this.getDom().className += " edui-colorbutton";
          },
          setColor: function(a) {
            this.getDom("colorlump").style.backgroundColor = a,
              this.color = a
          },
          _onPickColor: function(a) {
            this.fireEvent("pickcolor", a) !== !1 && (this.setColor(a), this.popup.hide())
          },
          _onPickNoColor: function(a) {
            this.fireEvent("picknocolor") !== !1 && this.popup.hide()
          }
        },
          a.inherits(f, e)
      } (),
      function() {
        var a = baidu.editor.utils,
          b = baidu.editor.ui.Popup,
          c = baidu.editor.ui.TablePicker,
          d = baidu.editor.ui.SplitButton,
          e = baidu.editor.ui.TableButton = function(a) {
            this.initOptions(a),
              this.initTableButton()
          };
        e.prototype = {
          initTableButton: function() {
            var a = this;
            this.popup = new b({
              content: new c({
                editor: a.editor,
                onpicktable: function(b, c, d) {
                  a._onPickTable(c, d)
                }
              }),
              editor: a.editor
            }),
              this.initSplitButton()
          },
          _onPickTable: function(a, b) {
            this.fireEvent("picktable", a, b) !== !1 && this.popup.hide()
          }
        },
          a.inherits(e, d)
      } (),
      function() {
        var a = baidu.editor.utils,
          b = baidu.editor.ui.UIBase,
          c = baidu.editor.ui.AutoTypeSetPicker = function(a) {
            this.initOptions(a),
              this.initAutoTypeSetPicker()
          };
        c.prototype = {
          initAutoTypeSetPicker: function() {
            this.initUIBase()
          },
          getHtmlTpl: function() {
            var a = this.editor,
              b = a.options.autotypeset,
              c = a.getLang("autoTypeSet"),
              d = "textAlignValue" + a.uid,
              e = "imageBlockLineValue" + a.uid,
              f = "symbolConverValue" + a.uid;
            return '<div id="##" class="edui-autotypesetpicker %%"><div class="edui-autotypesetpicker-body"><table ><tr><td nowrap><input type="checkbox" name="mergeEmptyline" ' + (b.mergeEmptyline ? "checked": "") + ">" + c.mergeLine + '</td><td colspan="2"><input type="checkbox" name="removeEmptyline" ' + (b.removeEmptyline ? "checked": "") + ">" + c.delLine + '</td></tr><tr><td nowrap><input type="checkbox" name="removeClass" ' + (b.removeClass ? "checked": "") + ">" + c.removeFormat + '</td><td colspan="2"><input type="checkbox" name="indent" ' + (b.indent ? "checked": "") + ">" + c.indent + '</td></tr><tr><td nowrap><input type="checkbox" name="textAlign" ' + (b.textAlign ? "checked": "") + ">" + c.alignment + '</td><td colspan="2" id="' + d + '"><input type="radio" name="' + d + '" value="left" ' + (b.textAlign && "left" == b.textAlign ? "checked": "") + ">" + a.getLang("justifyleft") + '<input type="radio" name="' + d + '" value="center" ' + (b.textAlign && "center" == b.textAlign ? "checked": "") + ">" + a.getLang("justifycenter") + '<input type="radio" name="' + d + '" value="right" ' + (b.textAlign && "right" == b.textAlign ? "checked": "") + ">" + a.getLang("justifyright") + '</td></tr><tr><td nowrap><input type="checkbox" name="imageBlockLine" ' + (b.imageBlockLine ? "checked": "") + ">" + c.imageFloat + '</td><td nowrap id="' + e + '"><input type="radio" name="' + e + '" value="none" ' + (b.imageBlockLine && "none" == b.imageBlockLine ? "checked": "") + ">" + a.getLang("default") + '<input type="radio" name="' + e + '" value="left" ' + (b.imageBlockLine && "left" == b.imageBlockLine ? "checked": "") + ">" + a.getLang("justifyleft") + '<input type="radio" name="' + e + '" value="center" ' + (b.imageBlockLine && "center" == b.imageBlockLine ? "checked": "") + ">" + a.getLang("justifycenter") + '<input type="radio" name="' + e + '" value="right" ' + (b.imageBlockLine && "right" == b.imageBlockLine ? "checked": "") + ">" + a.getLang("justifyright") + '</td></tr><tr><td nowrap><input type="checkbox" name="clearFontSize" ' + (b.clearFontSize ? "checked": "") + ">" + c.removeFontsize + '</td><td colspan="2"><input type="checkbox" name="clearFontFamily" ' + (b.clearFontFamily ? "checked": "") + ">" + c.removeFontFamily + '</td></tr><tr><td nowrap colspan="3"><input type="checkbox" name="removeEmptyNode" ' + (b.removeEmptyNode ? "checked": "") + ">" + c.removeHtml + '</td></tr><tr><td nowrap colspan="3"><input type="checkbox" name="pasteFilter" ' + (b.pasteFilter ? "checked": "") + ">" + c.pasteFilter + '</td></tr><tr><td nowrap><input type="checkbox" name="symbolConver" ' + (b.bdc2sb || b.tobdc ? "checked": "") + ">" + c.symbol + '</td><td id="' + f + '"><input type="radio" name="bdc" value="bdc2sb" ' + (b.bdc2sb ? "checked": "") + ">" + c.bdc2sb + '<input type="radio" name="bdc" value="tobdc" ' + (b.tobdc ? "checked": "") + ">" + c.tobdc + '</td><td nowrap align="right"><button >' + c.run + "</button></td></tr></table></div></div>"
          },
          _UIBase_render: b.prototype.render
        },
          a.inherits(c, b)
      } (),
      function() {
        function a(a) {
          for (var c, d = {},
                 e = a.getDom(), f = a.editor.uid, g = null, h = null, i = domUtils.getElementsByTagName(e, "input"), j = i.length - 1; c = i[j--];) if (g = c.getAttribute("type"), "checkbox" == g) if (h = c.getAttribute("name"), d[h] && delete d[h], c.checked) {
            var k = document.getElementById(h + "Value" + f);
            if (k) {
              if (/input/gi.test(k.tagName)) d[h] = k.value;
              else for (var l, m = k.getElementsByTagName("input"), n = m.length - 1; l = m[n--];) if (l.checked) {
                d[h] = l.value;
                break
              }
            } else d[h] = !0
          } else d[h] = !1;
          else d[c.getAttribute("value")] = c.checked;
          for (var o, p = domUtils.getElementsByTagName(e, "select"), j = 0; o = p[j++];) {
            var q = o.getAttribute("name");
            d[q] = d[q] ? o.value: ""
          }
          b.extend(a.editor.options.autotypeset, d),
            a.editor.setPreferences("autotypeset", d)
        }
        var b = baidu.editor.utils,
          c = baidu.editor.ui.Popup,
          d = baidu.editor.ui.AutoTypeSetPicker,
          e = baidu.editor.ui.SplitButton,
          f = baidu.editor.ui.AutoTypeSetButton = function(a) {
            this.initOptions(a),
              this.initAutoTypeSetButton()
          };
        f.prototype = {
          initAutoTypeSetButton: function() {
            var b = this;
            this.popup = new c({
              content: new d({
                editor: b.editor
              }),
              editor: b.editor,
              hide: function() { ! this._hidden && this.getDom() && (a(this), this.getDom().style.display = "none", this._hidden = !0, this.fireEvent("hide"))
              }
            });
            var e = 0;
            this.popup.addListener("postRenderAfter",
              function() {
                var c = this;
                if (!e) {
                  var d = this.getDom(),
                    f = d.getElementsByTagName("button")[0];
                  f.onclick = function() {
                    a(c),
                      b.editor.execCommand("autotypeset"),
                      c.hide()
                  },
                    domUtils.on(d, "click",
                      function(d) {
                        var e = d.target || d.srcElement,
                          f = b.editor.uid;
                        if (e && "INPUT" == e.tagName) {
                          if ("imageBlockLine" == e.name || "textAlign" == e.name || "symbolConver" == e.name) for (var g = e.checked,
                                                                                                                      h = document.getElementById(e.name + "Value" + f), i = h.getElementsByTagName("input"), j = {
                              imageBlockLine: "none",
                              textAlign: "left",
                              symbolConver: "tobdc"
                            },
                                                                                                                      k = 0; k < i.length; k++) g ? i[k].value == j[e.name] && (i[k].checked = "checked") : i[k].checked = !1;
                          if (e.name == "imageBlockLineValue" + f || e.name == "textAlignValue" + f || "bdc" == e.name) {
                            var l = e.parentNode.previousSibling.getElementsByTagName("input");
                            l && (l[0].checked = !0)
                          }
                          a(c)
                        }
                      }),
                    e = 1
                }
              }),
              this.initSplitButton()
          }
        },
          b.inherits(f, e)
      } (),
      function() {
        var a = baidu.editor.utils,
          b = baidu.editor.ui.Popup,
          c = baidu.editor.ui.Stateful,
          d = baidu.editor.ui.UIBase,
          e = baidu.editor.ui.CellAlignPicker = function(a) {
            this.initOptions(a),
              this.initSelected(),
              this.initCellAlignPicker()
          };
        e.prototype = {
          initSelected: function() {
            var a = {
              valign: {
                top: 0,
                middle: 1,
                bottom: 2
              },
              align: {
                left: 0,
                center: 1,
                right: 2
              },
              count: 3
            };
            this.selected && (this.selectedIndex = a.valign[this.selected.valign] * a.count + a.align[this.selected.align])
          },
          initCellAlignPicker: function() {
            this.initUIBase(),
              this.Stateful_init()
          },
          getHtmlTpl: function() {
            for (var a = ["left", "center", "right"], b = 9, c = null, d = -1, e = [], f = 0; f < b; f++) c = this.selectedIndex === f ? ' class="edui-cellalign-selected" ': "",
              d = f % 3,
            0 === d && e.push("<tr>"),
              e.push('<td index="' + f + '" ' + c + ' stateful><div class="edui-icon edui-' + a[d] + '"></div></td>'),
            2 === d && e.push("</tr>");
            return '<div id="##" class="edui-cellalignpicker %%"><div class="edui-cellalignpicker-body"><table onclick="$$._onClick(event);">' + e.join("") + "</table></div></div>"
          },
          getStateDom: function() {
            return this.target
          },
          _onClick: function(a) {
            var c = a.target || a.srcElement;
            /icon/.test(c.className) && (this.items[c.parentNode.getAttribute("index")].onclick(), b.postHide(a))
          },
          _UIBase_render: d.prototype.render
        },
          a.inherits(e, d),
          a.extend(e.prototype, c, !0)
      } (),
      function() {
        var a = baidu.editor.utils,
          b = baidu.editor.ui.Stateful,
          c = baidu.editor.ui.uiUtils,
          d = baidu.editor.ui.UIBase,
          e = baidu.editor.ui.PastePicker = function(a) {
            this.initOptions(a),
              this.initPastePicker()
          };
        e.prototype = {
          initPastePicker: function() {
            this.initUIBase(),
              this.Stateful_init()
          },
          getHtmlTpl: function() {
            return '<div class="edui-pasteicon" onclick="$$._onClick(this)"></div><div class="edui-pastecontainer"><div class="edui-title">' + this.editor.getLang("pasteOpt") + '</div><div class="edui-button"><div title="' + this.editor.getLang("pasteSourceFormat") + '" onclick="$$.format(false)" stateful><div class="edui-richtxticon"></div></div><div title="' + this.editor.getLang("tagFormat") + '" onclick="$$.format(2)" stateful><div class="edui-tagicon"></div></div><div title="' + this.editor.getLang("pasteTextFormat") + '" onclick="$$.format(true)" stateful><div class="edui-plaintxticon"></div></div></div></div></div>'
          },
          getStateDom: function() {
            return this.target
          },
          format: function(a) {
            this.editor.ui._isTransfer = !0,
              this.editor.fireEvent("pasteTransfer", a)
          },
          _onClick: function(a) {
            var b = domUtils.getNextDomNode(a),
              d = c.getViewportRect().height,
              e = c.getClientRect(b);
            e.top + e.height > d ? b.style.top = -e.height - a.offsetHeight + "px": b.style.top = "",
              /hidden/gi.test(domUtils.getComputedStyle(b, "visibility")) ? (b.style.visibility = "visible", domUtils.addClass(a, "edui-state-opened")) : (b.style.visibility = "hidden", domUtils.removeClasses(a, "edui-state-opened"))
          },
          _UIBase_render: d.prototype.render
        },
          a.inherits(e, d),
          a.extend(e.prototype, b, !0)
      } (),
      function() {
        var a = baidu.editor.utils,
          b = baidu.editor.ui.uiUtils,
          c = baidu.editor.ui.UIBase,
          d = baidu.editor.ui.Toolbar = function(a) {
            this.initOptions(a),
              this.initToolbar()
          };
        d.prototype = {
          items: null,
          initToolbar: function() {
            this.items = this.items || [],
              this.initUIBase()
          },
          add: function(a, b) {
            void 0 === b ? this.items.push(a) : this.items.splice(b, 0, a)
          },
          getHtmlTpl: function() {
            for (var a = [], b = 0; b < this.items.length; b++) a[b] = this.items[b].renderHtml();
            return '<div id="##" class="edui-toolbar %%" onselectstart="return false;" onmousedown="return $$._onMouseDown(event, this);">' + a.join("") + "</div>"
          },
          postRender: function() {
            for (var a = this.getDom(), c = 0; c < this.items.length; c++) this.items[c].postRender();
            b.makeUnselectable(a)
          },
          _onMouseDown: function(a) {
            var b = a.target || a.srcElement,
              c = b && b.tagName && b.tagName.toLowerCase();
            if ("input" == c || "object" == c || "object" == c) return ! 1
          }
        },
          a.inherits(d, c)
      } (),
      function() {
        var a = baidu.editor.utils,
          b = baidu.editor.dom.domUtils,
          c = baidu.editor.ui.uiUtils,
          d = baidu.editor.ui.UIBase,
          e = baidu.editor.ui.Popup,
          f = baidu.editor.ui.Stateful,
          g = baidu.editor.ui.CellAlignPicker,
          h = baidu.editor.ui.Menu = function(a) {
            this.initOptions(a),
              this.initMenu()
          },
          i = {
            renderHtml: function() {
              return '<div class="edui-menuitem edui-menuseparator"><div class="edui-menuseparator-inner"></div></div>'
            },
            postRender: function() {},
            queryAutoHide: function() {
              return ! 0
            }
          };
        h.prototype = {
          items: null,
          uiName: "menu",
          initMenu: function() {
            this.items = this.items || [],
              this.initPopup(),
              this.initItems()
          },
          initItems: function() {
            for (var a = 0; a < this.items.length; a++) {
              var b = this.items[a];
              "-" == b ? this.items[a] = this.getSeparator() : b instanceof j || (b.editor = this.editor, b.theme = this.editor.options.theme, this.items[a] = this.createItem(b))
            }
          },
          getSeparator: function() {
            return i
          },
          createItem: function(a) {
            return a.menu = this,
              new j(a)
          },
          _Popup_getContentHtmlTpl: e.prototype.getContentHtmlTpl,
          getContentHtmlTpl: function() {
            if (0 == this.items.length) return this._Popup_getContentHtmlTpl();
            for (var a = [], b = 0; b < this.items.length; b++) {
              var c = this.items[b];
              a[b] = c.renderHtml()
            }
            return '<div class="%%-body">' + a.join("") + "</div>"
          },
          _Popup_postRender: e.prototype.postRender,
          postRender: function() {
            for (var a = this,
                   d = 0; d < this.items.length; d++) {
              var e = this.items[d];
              e.ownerMenu = this,
                e.postRender()
            }
            b.on(this.getDom(), "mouseover",
              function(b) {
                b = b || event;
                var d = b.relatedTarget || b.fromElement,
                  e = a.getDom();
                c.contains(e, d) || e === d || a.fireEvent("over")
              }),
              this._Popup_postRender()
          },
          queryAutoHide: function(a) {
            if (a) {
              if (c.contains(this.getDom(), a)) return ! 1;
              for (var b = 0; b < this.items.length; b++) {
                var d = this.items[b];
                if (d.queryAutoHide(a) === !1) return ! 1
              }
            }
          },
          clearItems: function() {
            for (var a = 0; a < this.items.length; a++) {
              var b = this.items[a];
              clearTimeout(b._showingTimer),
                clearTimeout(b._closingTimer),
              b.subMenu && b.subMenu.destroy()
            }
            this.items = []
          },
          destroy: function() {
            this.getDom() && b.remove(this.getDom()),
              this.clearItems()
          },
          dispose: function() {
            this.destroy()
          }
        },
          a.inherits(h, e);
        var j = baidu.editor.ui.MenuItem = function(a) {
          if (this.initOptions(a), this.initUIBase(), this.Stateful_init(), this.subMenu && !(this.subMenu instanceof h)) if (a.className && a.className.indexOf("aligntd") != -1) {
            var c = this;
            this.subMenu.selected = this.editor.queryCommandValue("cellalignment"),
              this.subMenu = new e({
                content: new g(this.subMenu),
                parentMenu: c,
                editor: c.editor,
                destroy: function() {
                  this.getDom() && b.remove(this.getDom())
                }
              }),
              this.subMenu.addListener("postRenderAfter",
                function() {
                  b.on(this.getDom(), "mouseover",
                    function() {
                      c.addState("opened")
                    })
                })
          } else this.subMenu = new h(this.subMenu)
        };
        j.prototype = {
          label: "",
          subMenu: null,
          ownerMenu: null,
          uiName: "menuitem",
          alwalysHoverable: !0,
          getHtmlTpl: function() {
            return '<div id="##" class="%%" stateful onclick="$$._onClick(event, this);"><div class="%%-body">' + this.renderLabelHtml() + "</div></div>"
          },
          postRender: function() {
            var a = this;
            this.addListener("over",
              function() {
                a.ownerMenu.fireEvent("submenuover", a),
                a.subMenu && a.delayShowSubMenu()
              }),
            this.subMenu && (this.getDom().className += " edui-hassubmenu", this.subMenu.render(), this.addListener("out",
              function() {
                a.delayHideSubMenu()
              }), this.subMenu.addListener("over",
              function() {
                clearTimeout(a._closingTimer),
                  a._closingTimer = null,
                  a.addState("opened")
              }), this.ownerMenu.addListener("hide",
              function() {
                a.hideSubMenu()
              }), this.ownerMenu.addListener("submenuover",
              function(b, c) {
                c !== a && a.delayHideSubMenu()
              }), this.subMenu._bakQueryAutoHide = this.subMenu.queryAutoHide, this.subMenu.queryAutoHide = function(b) {
              return (!b || !c.contains(a.getDom(), b)) && this._bakQueryAutoHide(b)
            }),
              this.getDom().style.tabIndex = "-1",
              c.makeUnselectable(this.getDom()),
              this.Stateful_postRender()
          },
          delayShowSubMenu: function() {
            var a = this;
            a.isDisabled() || (a.addState("opened"), clearTimeout(a._showingTimer), clearTimeout(a._closingTimer), a._closingTimer = null, a._showingTimer = setTimeout(function() {
                a.showSubMenu()
              },
              250))
          },
          delayHideSubMenu: function() {
            var a = this;
            a.isDisabled() || (a.removeState("opened"), clearTimeout(a._showingTimer), a._closingTimer || (a._closingTimer = setTimeout(function() {
                a.hasState("opened") || a.hideSubMenu(),
                  a._closingTimer = null
              },
              400)))
          },
          renderLabelHtml: function() {
            return '<div class="edui-arrow"></div><div class="edui-box edui-icon"></div><div class="edui-box edui-label %%-label">' + (this.label || "") + "</div>"
          },
          getStateDom: function() {
            return this.getDom()
          },
          queryAutoHide: function(a) {
            if (this.subMenu && this.hasState("opened")) return this.subMenu.queryAutoHide(a)
          },
          _onClick: function(a, b) {
            this.hasState("disabled") || this.fireEvent("click", a, b) !== !1 && (this.subMenu ? this.showSubMenu() : e.postHide(a))
          },
          showSubMenu: function() {
            var a = c.getClientRect(this.getDom());
            a.right -= 5,
              a.left += 2,
              a.width -= 7,
              a.top -= 4,
              a.bottom += 4,
              a.height += 8,
              this.subMenu.showAnchorRect(a, !0, !0)
          },
          hideSubMenu: function() {
            this.subMenu.hide()
          }
        },
          a.inherits(j, d),
          a.extend(j.prototype, f, !0)
      } (),
      function() {
        var a = baidu.editor.utils,
          b = baidu.editor.ui.uiUtils,
          c = baidu.editor.ui.Menu,
          d = baidu.editor.ui.SplitButton,
          e = baidu.editor.ui.Combox = function(a) {
            this.initOptions(a),
              this.initCombox()
          };
        e.prototype = {
          uiName: "combox",
          onbuttonclick: function() {
            this.showPopup()
          },
          initCombox: function() {
            var a = this;
            this.items = this.items || [];
            for (var b = 0; b < this.items.length; b++) {
              var d = this.items[b];
              d.uiName = "listitem",
                d.index = b,
                d.onclick = function() {
                  a.selectByIndex(this.index)
                }
            }
            this.popup = new c({
              items: this.items,
              uiName: "list",
              editor: this.editor,
              captureWheel: !0,
              combox: this
            }),
              this.initSplitButton()
          },
          _SplitButton_postRender: d.prototype.postRender,
          postRender: function() {
            this._SplitButton_postRender(),
              this.setLabel(this.label || ""),
              this.setValue(this.initValue || "")
          },
          showPopup: function() {
            var a = b.getClientRect(this.getDom());
            a.top += 1,
              a.bottom -= 1,
              a.height -= 2,
              this.popup.showAnchorRect(a)
          },
          getValue: function() {
            return this.value
          },
          setValue: function(a) {
            var b = this.indexByValue(a);
            b != -1 ? (this.selectedIndex = b, this.setLabel(this.items[b].label), this.value = this.items[b].value) : (this.selectedIndex = -1, this.setLabel(this.getLabelForUnknowValue(a)), this.value = a)
          },
          setLabel: function(a) {
            this.getDom("button_body").innerHTML = a,
              this.label = a
          },
          getLabelForUnknowValue: function(a) {
            return a
          },
          indexByValue: function(a) {
            for (var b = 0; b < this.items.length; b++) if (a == this.items[b].value) return b;
            return - 1
          },
          getItem: function(a) {
            return this.items[a]
          },
          selectByIndex: function(a) {
            a < this.items.length && this.fireEvent("select", a) !== !1 && (this.selectedIndex = a, this.value = this.items[a].value, this.setLabel(this.items[a].label))
          }
        },
          a.inherits(e, d)
      } (),
      function() {
        var a, b, c, d = baidu.editor.utils,
          e = baidu.editor.dom.domUtils,
          f = baidu.editor.ui.uiUtils,
          g = baidu.editor.ui.Mask,
          h = baidu.editor.ui.UIBase,
          i = baidu.editor.ui.Button,
          j = baidu.editor.ui.Dialog = function(a) {
            if (a.name) {
              var b = a.name,
                c = a.cssRules;
              a.className || (a.className = "edui-for-" + b),
              c && (a.cssRules = ".edui-default .edui-for-" + b + " .edui-dialog-content  {" + c + "}")
            }
            this.initOptions(d.extend({
                autoReset: !0,
                draggable: !0,
                onok: function() {},
                oncancel: function() {},
                onclose: function(a, b) {
                  return b ? this.onok() : this.oncancel()
                },
                holdScroll: !1
              },
              a)),
              this.initDialog()
          };
        j.prototype = {
          draggable: !1,
          uiName: "dialog",
          initDialog: function() {
            var e = this,
              f = this.editor.options.theme;
            if (this.cssRules && d.cssRule("edui-customize-" + this.name + "-style", this.cssRules), this.initUIBase(), this.modalMask = a || (a = new g({
              className: "edui-dialog-modalmask",
              theme: f,
              onclick: function() {
                c && c.close(!1)
              }
            })), this.dragMask = b || (b = new g({
              className: "edui-dialog-dragmask",
              theme: f
            })), this.closeButton = new i({
              className: "edui-dialog-closebutton",
              title: e.closeDialog,
              theme: f,
              onclick: function() {
                e.close(!1)
              }
            }), this.fullscreen && this.initResizeEvent(), this.buttons) for (var h = 0; h < this.buttons.length; h++) this.buttons[h] instanceof i || (this.buttons[h] = new i(d.extend(this.buttons[h], {
                editor: this.editor
              },
              !0)))
          },
          initResizeEvent: function() {
            var a = this;
            e.on(window, "resize",
              function() {
                a._hidden || void 0 === a._hidden || (a.__resizeTimer && window.clearTimeout(a.__resizeTimer), a.__resizeTimer = window.setTimeout(function() {
                    a.__resizeTimer = null;
                    var b = a.getDom(),
                      c = a.getDom("content"),
                      d = UE.ui.uiUtils.getClientRect(b),
                      e = UE.ui.uiUtils.getClientRect(c),
                      g = f.getViewportRect();
                    c.style.width = g.width - d.width + e.width + "px",
                      c.style.height = g.height - d.height + e.height + "px",
                      b.style.width = g.width + "px",
                      b.style.height = g.height + "px",
                      a.fireEvent("resize")
                  },
                  100))
              })
          },
          fitSize: function() {
            var a = this.getDom("body"),
              b = this.mesureSize();
            return a.style.width = b.width + "px",
              a.style.height = b.height + "px",
              b
          },
          safeSetOffset: function(a) {
            var b = this,
              c = b.getDom(),
              d = f.getViewportRect(),
              e = f.getClientRect(c),
              g = a.left;
            g + e.width > d.right && (g = d.right - e.width);
            var h = a.top;
            h + e.height > d.bottom && (h = d.bottom - e.height),
              c.style.left = Math.max(g, 0) + "px",
              c.style.top = Math.max(h, 0) + "px"
          },
          showAtCenter: function() {
            var a = f.getViewportRect();
            if (this.fullscreen) {
              var b = this.getDom(),
                c = this.getDom("content");
              b.style.display = "block";
              var d = UE.ui.uiUtils.getClientRect(b),
                g = UE.ui.uiUtils.getClientRect(c);
              b.style.left = "-100000px",
                c.style.width = a.width - d.width + g.width + "px",
                c.style.height = a.height - d.height + g.height + "px",
                b.style.width = a.width + "px",
                b.style.height = a.height + "px",
                b.style.left = 0,
                this._originalContext = {
                  html: {
                    overflowX: document.documentElement.style.overflowX,
                    overflowY: document.documentElement.style.overflowY
                  },
                  body: {
                    overflowX: document.body.style.overflowX,
                    overflowY: document.body.style.overflowY
                  }
                },
                document.documentElement.style.overflowX = "hidden",
                document.documentElement.style.overflowY = "hidden",
                document.body.style.overflowX = "hidden",
                document.body.style.overflowY = "hidden"
            } else {
              this.getDom().style.display = "";
              var h = this.fitSize(),
                i = 0 | this.getDom("titlebar").offsetHeight,
                j = a.width / 2 - h.width / 2,
                k = a.height / 2 - (h.height - i) / 2 - i,
                l = this.getDom();
              this.safeSetOffset({
                left: Math.max(0 | j, 0),
                top: Math.max(0 | k, 0)
              }),
              e.hasClass(l, "edui-state-centered") || (l.className += " edui-state-centered")
            }
            this._show()
          },
          getContentHtml: function() {
            var a = "";
            return "string" == typeof this.content ? a = this.content: this.iframeUrl && (a = '<span id="' + this.id + '_contmask" class="dialogcontmask"></span><iframe id="' + this.id + '_iframe" class="%%-iframe" height="100%" width="100%" frameborder="0" src="' + this.iframeUrl + '"></iframe>'),
              a
          },
          getHtmlTpl: function() {
            var a = "";
            if (this.buttons) {
              for (var b = [], c = 0; c < this.buttons.length; c++) b[c] = this.buttons[c].renderHtml();
              a = '<div class="%%-foot"><div id="##_buttons" class="%%-buttons">' + b.join("") + "</div></div>"
            }
            return '<div id="##" class="%%"><div ' + (this.fullscreen ? 'class="%%-wrap edui-dialog-fullscreen-flag"': 'class="%%"') + '><div id="##_body" class="%%-body"><div class="%%-shadow"></div><div id="##_titlebar" class="%%-titlebar"><div class="%%-draghandle" onmousedown="$$._onTitlebarMouseDown(event, this);"><span class="%%-caption">' + (this.title || "") + "</span></div>" + this.closeButton.renderHtml() + '</div><div id="##_content" class="%%-content">' + (this.autoReset ? "": this.getContentHtml()) + "</div>" + a + "</div></div></div>"
          },
          postRender: function() {
            this.modalMask.getDom() || (this.modalMask.render(), this.modalMask.hide()),
            this.dragMask.getDom() || (this.dragMask.render(), this.dragMask.hide());
            var a = this;
            if (this.addListener("show",
              function() {
                a.modalMask.show(this.getDom().style.zIndex - 2)
              }), this.addListener("hide",
              function() {
                a.modalMask.hide()
              }), this.buttons) for (var b = 0; b < this.buttons.length; b++) this.buttons[b].postRender();
            e.on(window, "resize",
              function() {
                setTimeout(function() {
                  a.isHidden() || a.safeSetOffset(f.getClientRect(a.getDom()))
                })
              }),
              this._hide()
          },
          mesureSize: function() {
            var a = this.getDom("body"),
              b = f.getClientRect(this.getDom("content")).width,
              c = a.style;
            return c.width = b,
              f.getClientRect(a)
          },
          _onTitlebarMouseDown: function(a, b) {
            if (this.draggable) {
              var c, d = (f.getViewportRect(), this);
              f.startDrag(a, {
                ondragstart: function() {
                  c = f.getClientRect(d.getDom()),
                    d.getDom("contmask").style.visibility = "visible",
                    d.dragMask.show(d.getDom().style.zIndex - 1)
                },
                ondragmove: function(a, b) {
                  var e = c.left + a,
                    f = c.top + b;
                  d.safeSetOffset({
                    left: e,
                    top: f
                  })
                },
                ondragstop: function() {
                  d.getDom("contmask").style.visibility = "hidden",
                    e.removeClasses(d.getDom(), ["edui-state-centered"]),
                    d.dragMask.hide()
                }
              })
            }
          },
          reset: function() {
            this.getDom("content").innerHTML = this.getContentHtml(),
              this.fireEvent("dialogafterreset")
          },
          _show: function() {
            this._hidden && (this.getDom().style.display = "", this.editor.container.style.zIndex && (this.getDom().style.zIndex = 1 * this.editor.container.style.zIndex + 10), this._hidden = !1, this.fireEvent("show"), baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex = this.getDom().style.zIndex - 4)
          },
          isHidden: function() {
            return this._hidden
          },
          _hide: function() {
            if (!this._hidden) {
              var a = this.getDom();
              a.style.display = "none",
                a.style.zIndex = "",
                a.style.width = "",
                a.style.height = "",
                this._hidden = !0,
                this.fireEvent("hide")
            }
          },
          open: function() {
            if (this.autoReset) try {
              this.reset()
            } catch(a) {
              this.render(),
                this.open()
            }
            if (this.showAtCenter(), this.iframeUrl) try {
              this.getDom("iframe").focus()
            } catch(b) {}
            c = this
          },
          _onCloseButtonClick: function(a, b) {
            this.close(!1)
          },
          close: function(a) {
            if (this.fireEvent("close", a) !== !1) {
              this.fullscreen && (document.documentElement.style.overflowX = this._originalContext.html.overflowX, document.documentElement.style.overflowY = this._originalContext.html.overflowY, document.body.style.overflowX = this._originalContext.body.overflowX, document.body.style.overflowY = this._originalContext.body.overflowY, delete this._originalContext),
                this._hide();
              var b = this.getDom("content"),
                c = this.getDom("iframe");
              if (b && c) {
                var d = c.contentDocument || c.contentWindow.document;
                d && (d.body.innerHTML = ""),
                  e.remove(b)
              }
            }
          }
        },
          d.inherits(j, h)
      } (),
      function() {
        var a = baidu.editor.utils,
          b = baidu.editor.ui.Menu,
          c = baidu.editor.ui.SplitButton,
          d = baidu.editor.ui.MenuButton = function(a) {
            this.initOptions(a),
              this.initMenuButton()
          };
        d.prototype = {
          initMenuButton: function() {
            var a = this;
            this.uiName = "menubutton",
              this.popup = new b({
                items: a.items,
                className: a.className,
                editor: a.editor
              }),
              this.popup.addListener("show",
                function() {
                  for (var b = this,
                         c = 0; c < b.items.length; c++) b.items[c].removeState("checked"),
                  b.items[c].value == a._value && (b.items[c].addState("checked"), this.value = a._value)
                }),
              this.initSplitButton()
          },
          setValue: function(a) {
            this._value = a
          }
        },
          a.inherits(d, c)
      } (),
      function() {
        var a = baidu.editor.utils,
          b = baidu.editor.ui.Popup,
          c = baidu.editor.ui.SplitButton,
          d = baidu.editor.ui.MultiMenuPop = function(a) {
            this.initOptions(a),
              this.initMultiMenu()
          };
        d.prototype = {
          initMultiMenu: function() {
            var a = this;
            this.popup = new b({
              content: "",
              editor: a.editor,
              iframe_rendered: !1,
              onshow: function() {
                this.iframe_rendered || (this.iframe_rendered = !0, this.getDom("content").innerHTML = '<iframe id="' + a.id + '_iframe" src="' + a.iframeUrl + '" frameborder="0"></iframe>', a.editor.container.style.zIndex && (this.getDom().style.zIndex = 1 * a.editor.container.style.zIndex + 1))
              }
            }),
              this.onbuttonclick = function() {
                this.showPopup()
              },
              this.initSplitButton()
          }
        },
          a.inherits(d, c)
      } (),
      function() {
        function a(a) {
          var b = a.target || a.srcElement,
            c = g.findParent(b,
              function(a) {
                return g.hasClass(a, "edui-shortcutmenu") || g.hasClass(a, "edui-popup")
              },
              !0);
          if (!c) for (var d, e = 0; d = h[e++];) d.hide()
        }
        var b, c = baidu.editor.ui,
          d = c.UIBase,
          e = c.uiUtils,
          f = baidu.editor.utils,
          g = baidu.editor.dom.domUtils,
          h = [],
          i = !1,
          j = c.ShortCutMenu = function(a) {
            this.initOptions(a),
              this.initShortCutMenu()
          };
        j.postHide = a,
          j.prototype = {
            isHidden: !0,
            SPACE: 5,
            initShortCutMenu: function() {
              this.items = this.items || [],
                this.initUIBase(),
                this.initItems(),
                this.initEvent(),
                h.push(this)
            },
            initEvent: function() {
              var a = this,
                c = a.editor.document;
              g.on(c, "mousemove",
                function(c) {
                  if (a.isHidden === !1) {
                    if (a.getSubMenuMark() || "contextmenu" == a.eventType) return;
                    var d = !0,
                      e = a.getDom(),
                      f = e.offsetWidth,
                      g = e.offsetHeight,
                      h = f / 2 + a.SPACE,
                      i = g / 2,
                      j = Math.abs(c.screenX - a.left),
                      k = Math.abs(c.screenY - a.top);
                    clearTimeout(b),
                      b = setTimeout(function() {
                        k > 0 && k < i ? a.setOpacity(e, "1") : k > i && k < i + 70 ? (a.setOpacity(e, "0.5"), d = !1) : k > i + 70 && k < i + 140 && a.hide(),
                          d && j > 0 && j < h ? a.setOpacity(e, "1") : j > h && j < h + 70 ? a.setOpacity(e, "0.5") : j > h + 70 && j < h + 140 && a.hide()
                      })
                  }
                }),
              browser.chrome && g.on(c, "mouseout",
                function(b) {
                  var c = b.relatedTarget || b.toElement;
                  null != c && "HTML" != c.tagName || a.hide()
                }),
                a.editor.addListener("afterhidepop",
                  function() {
                    a.isHidden || (i = !0)
                  })
            },
            initItems: function() {
              if (f.isArray(this.items)) for (var a = 0,
                                                b = this.items.length; a < b; a++) {
                var d = this.items[a].toLowerCase();
                c[d] && (this.items[a] = new c[d](this.editor), this.items[a].className += " edui-shortcutsubmenu ")
              }
            },
            setOpacity: function(a, b) {
              browser.ie && browser.version < 9 ? a.style.filter = "alpha(opacity = " + 100 * parseFloat(b) + ");": a.style.opacity = b
            },
            getSubMenuMark: function() {
              i = !1;
              for (var a, b = e.getFixedLayer(), c = g.getElementsByTagName(b, "div",
                function(a) {
                  return g.hasClass(a, "edui-shortcutsubmenu edui-popup")
                }), d = 0; a = c[d++];)"none" != a.style.display && (i = !0);
              return i
            },
            show: function(a, b) {
              function c(a) {
                a.left < 0 && (a.left = 0),
                a.top < 0 && (a.top = 0),
                  i.style.cssText = "position:absolute;left:" + a.left + "px;top:" + a.top + "px;"
              }
              function d(a) {
                a.tagName || (a = a.getDom()),
                  h.left = parseInt(a.style.left),
                  h.top = parseInt(a.style.top),
                  h.top -= i.offsetHeight + 15,
                  c(h)
              }
              var f = this,
                h = {},
                i = this.getDom(),
                j = e.getFixedLayer();
              if (f.eventType = a.type, i.style.cssText = "display:block;left:-9999px", "contextmenu" == a.type && b) {
                var k = g.getElementsByTagName(j, "div", "edui-contextmenu")[0];
                k ? d(k) : f.editor.addListener("aftershowcontextmenu",
                  function(a, b) {
                    d(b)
                  })
              } else h = e.getViewportOffsetByEvent(a),
                h.top -= i.offsetHeight + f.SPACE,
                h.left += f.SPACE + 20,
                c(h),
                f.setOpacity(i, .2);
              f.isHidden = !1,
                f.left = a.screenX + i.offsetWidth / 2 - f.SPACE,
                f.top = a.screenY - i.offsetHeight / 2 - f.SPACE,
              f.editor && (i.style.zIndex = 1 * f.editor.container.style.zIndex + 10, j.style.zIndex = i.style.zIndex - 1)
            },
            hide: function() {
              this.getDom() && (this.getDom().style.display = "none"),
                this.isHidden = !0
            },
            postRender: function() {
              if (f.isArray(this.items)) for (var a, b = 0; a = this.items[b++];) a.postRender()
            },
            getHtmlTpl: function() {
              var a;
              if (f.isArray(this.items)) {
                a = [];
                for (var b = 0; b < this.items.length; b++) a[b] = this.items[b].renderHtml();
                a = a.join("")
              } else a = this.items;
              return '<div id="##" class="%% edui-toolbar" data-src="shortcutmenu" onmousedown="return false;" onselectstart="return false;" >' + a + "</div>"
            }
          },
          f.inherits(j, d),
          g.on(document, "mousedown",
            function(b) {
              a(b)
            }),
          g.on(window, "scroll",
            function(b) {
              a(b)
            })
      } (),
      function() {
        var a = baidu.editor.utils,
          b = baidu.editor.ui.UIBase,
          c = baidu.editor.ui.Breakline = function(a) {
            this.initOptions(a),
              this.initSeparator()
          };
        c.prototype = {
          uiName: "Breakline",
          initSeparator: function() {
            this.initUIBase()
          },
          getHtmlTpl: function() {
            return "<br/>"
          }
        },
          a.inherits(c, b)
      } (),
      function() {
        var a = baidu.editor.utils,
          b = baidu.editor.dom.domUtils,
          c = baidu.editor.ui.UIBase,
          d = baidu.editor.ui.Message = function(a) {
            this.initOptions(a),
              this.initMessage()
          };
        d.prototype = {
          initMessage: function() {
            this.initUIBase()
          },
          getHtmlTpl: function() {
            return '<div id="##" class="edui-message %%"> <div id="##_closer" class="edui-message-closer">×</div> <div id="##_body" class="edui-message-body edui-message-type-info"> <iframe style="position:absolute;z-index:-1;left:0;top:0;background-color: transparent;" frameborder="0" width="100%" height="100%" src="about:blank"></iframe> <div class="edui-shadow"></div> <div id="##_content" class="edui-message-content">  </div> </div></div>'
          },
          reset: function(a) {
            var b = this;
            a.keepshow || (clearTimeout(this.timer), b.timer = setTimeout(function() {
                b.hide()
              },
              a.timeout || 4e3)),
            void 0 !== a.content && b.setContent(a.content),
            void 0 !== a.type && b.setType(a.type),
              b.show()
          },
          postRender: function() {
            var a = this,
              c = this.getDom("closer");
            c && b.on(c, "click",
              function() {
                a.hide()
              })
          },
          setContent: function(a) {
            this.getDom("content").innerHTML = a
          },
          setType: function(a) {
            a = a || "info";
            var b = this.getDom("body");
            b.className = b.className.replace(/edui-message-type-[\w-]+/, "edui-message-type-" + a)
          },
          getContent: function() {
            return this.getDom("content").innerHTML
          },
          getType: function() {
            var a = this.getDom("body").match(/edui-message-type-([\w-]+)/);
            return a ? a[1] : ""
          },
          show: function() {
            this.getDom().style.display = "block"
          },
          hide: function() {
            var a = this.getDom();
            a && (a.style.display = "none", a.parentNode && a.parentNode.removeChild(a))
          }
        },
          a.inherits(d, c)
      } (),
      function() {
        var a = baidu.editor.utils,
          b = baidu.editor.ui,
          c = b.Dialog;
        b.buttons = {},
          b.Dialog = function(a) {
            var b = new c(a);
            return b.addListener("hide",
              function() {
                if (b.editor) {
                  var a = b.editor;
                  try {
                    if (browser.gecko) {
                      var c = a.window.scrollY,
                        d = a.window.scrollX;
                      a.body.focus(),
                        a.window.scrollTo(d, c)
                    } else a.focus()
                  } catch(e) {}
                }
              }),
              b
          };
        for (var d, e = {
            anchor: "~/dialogs/anchor/anchor.html",
            insertimage: "~/dialogs/image/image.html",
            link: "~/dialogs/link/link.html",
            spechars: "~/dialogs/spechars/spechars.html",
            searchreplace: "~/dialogs/searchreplace/searchreplace.html",
            map: "~/dialogs/map/map.html",
            gmap: "~/dialogs/gmap/gmap.html",
            insertvideo: "~/dialogs/video/video.html",
            help: "~/dialogs/help/help.html",
            preview: "~/dialogs/preview/preview.html",
            emotion: "~/dialogs/emotion/emotion.html",
            wordimage: "~/dialogs/wordimage/wordimage.html",
            attachment: "~/dialogs/attachment/attachment.html",
            insertframe: "~/dialogs/insertframe/insertframe.html",
            edittip: "~/dialogs/table/edittip.html",
            edittable: "~/dialogs/table/edittable.html",
            edittd: "~/dialogs/table/edittd.html",
            webapp: "~/dialogs/webapp/webapp.html",
            snapscreen: "~/dialogs/snapscreen/snapscreen.html",
            scrawl: "~/dialogs/scrawl/scrawl.html",
            music: "~/dialogs/music/music.html",
            template: "~/dialogs/template/template.html",
            background: "~/dialogs/background/background.html",
            charts: "~/dialogs/charts/charts.html"
          },
               f = ["undo", "redo", "formatmatch", "bold", "italic", "underline", "fontborder", "touppercase", "tolowercase", "strikethrough", "subscript", "superscript", "source", "indent", "outdent", "blockquote", "pasteplain", "pagebreak", "selectall", "print", "horizontal", "removeformat", "time", "date", "unlink", "insertparagraphbeforetable", "insertrow", "insertcol", "mergeright", "mergedown", "deleterow", "deletecol", "splittorows", "splittocols", "splittocells", "mergecells", "deletetable", "drafts"], g = 0; d = f[g++];) d = d.toLowerCase(),
          b[d] = function(a) {
            return function(c) {
              var d = new b.Button({
                className: "edui-for-" + a,
                title: c.options.labelMap[a] || c.getLang("labelMap." + a) || "",
                onclick: function() {
                  c.execCommand(a)
                },
                theme: c.options.theme,
                showText: !1
              });
              return b.buttons[a] = d,
                c.addListener("selectionchange",
                  function(b, e, f) {
                    var g = c.queryCommandState(a);
                    g == -1 ? (d.setDisabled(!0), d.setChecked(!1)) : f || (d.setDisabled(!1), d.setChecked(g))
                  }),
                d
            }
          } (d);
        b.cleardoc = function(a) {
          var c = new b.Button({
            className: "edui-for-cleardoc",
            title: a.options.labelMap.cleardoc || a.getLang("labelMap.cleardoc") || "",
            theme: a.options.theme,
            onclick: function() {
              confirm(a.getLang("confirmClear")) && a.execCommand("cleardoc")
            }
          });
          return b.buttons.cleardoc = c,
            a.addListener("selectionchange",
              function() {
                c.setDisabled(a.queryCommandState("cleardoc") == -1)
              }),
            c
        };
        var h = {
          justify: ["left", "right", "center", "justify"],
          imagefloat: ["none", "left", "center", "right"],
          directionality: ["ltr", "rtl"]
        };
        for (var i in h) !
          function(a, c) {
            for (var d, e = 0; d = c[e++];) !
              function(c) {
                b[a.replace("float", "") + c] = function(d) {
                  var e = new b.Button({
                    className: "edui-for-" + a.replace("float", "") + c,
                    title: d.options.labelMap[a.replace("float", "") + c] || d.getLang("labelMap." + a.replace("float", "") + c) || "",
                    theme: d.options.theme,
                    onclick: function() {
                      d.execCommand(a, c)
                    }
                  });
                  return b.buttons[a] = e,
                    d.addListener("selectionchange",
                      function(b, f, g) {
                        e.setDisabled(d.queryCommandState(a) == -1),
                          e.setChecked(d.queryCommandValue(a) == c && !g)
                      }),
                    e
                }
              } (d)
          } (i, h[i]);
        for (var d, g = 0; d = ["backcolor", "forecolor"][g++];) b[d] = function(a) {
          return function(c) {
            var d = new b.ColorButton({
              className: "edui-for-" + a,
              color: "default",
              title: c.options.labelMap[a] || c.getLang("labelMap." + a) || "",
              editor: c,
              onpickcolor: function(b, d) {
                c.execCommand(a, d)
              },
              onpicknocolor: function() {
                c.execCommand(a, "default"),
                  this.setColor("transparent"),
                  this.color = "default"
              },
              onbuttonclick: function() {
                c.execCommand(a, this.color)
              }
            });
            return b.buttons[a] = d,
              c.addListener("selectionchange",
                function() {
                  d.setDisabled(c.queryCommandState(a) == -1)
                }),
              d
          }
        } (d);
        var j = {
          noOk: ["searchreplace", "help", "spechars", "webapp", "preview"],
          ok: ["attachment", "anchor", "link", "insertimage", "map", "gmap", "insertframe", "wordimage", "insertvideo", "insertframe", "edittip", "edittable", "edittd", "scrawl", "template", "music", "background", "charts"]
        };
        for (var i in j) !
          function(c, d) {
            for (var f, g = 0; f = d[g++];) browser.opera && "searchreplace" === f || !
              function(d) {
                b[d] = function(f, g, h) {
                  g = g || (f.options.iframeUrlMap || {})[d] || e[d],
                    h = f.options.labelMap[d] || f.getLang("labelMap." + d) || "";
                  var i;
                  g && (i = new b.Dialog(a.extend({
                      iframeUrl: f.ui.mapUrl(g),
                      editor: f,
                      className: "edui-for-" + d,
                      title: h,
                      holdScroll: "insertimage" === d,
                      fullscreen: /charts|preview/.test(d),
                      closeDialog: f.getLang("closeDialog")
                    },
                    "ok" == c ? {
                      buttons: [{
                        className: "edui-okbutton",
                        label: f.getLang("ok"),
                        editor: f,
                        onclick: function() {
                          i.close(!0)
                        }
                      },
                        {
                          className: "edui-cancelbutton",
                          label: f.getLang("cancel"),
                          editor: f,
                          onclick: function() {
                            i.close(!1)
                          }
                        }]
                    }: {})), f.ui._dialogs[d + "Dialog"] = i);
                  var j = new b.Button({
                    className: "edui-for-" + d,
                    title: h,
                    onclick: function() {
                      if (i) switch (d) {
                        case "wordimage":
                          var a = f.execCommand("wordimage");
                          a && a.length && (i.render(), i.open());
                          break;
                        case "scrawl":
                          f.queryCommandState("scrawl") != -1 && (i.render(), i.open());
                          break;
                        default:
                          i.render(),
                            i.open()
                      }
                    },
                    theme: f.options.theme,
                    disabled: "scrawl" == d && f.queryCommandState("scrawl") == -1 || "charts" == d
                  });
                  return b.buttons[d] = j,
                    f.addListener("selectionchange",
                      function() {
                        var a = {
                          edittable: 1
                        };
                        if (! (d in a)) {
                          var b = f.queryCommandState(d);
                          j.getDom() && (j.setDisabled(b == -1), j.setChecked(b))
                        }
                      }),
                    j
                }
              } (f.toLowerCase())
          } (i, j[i]);
        b.snapscreen = function(a, c, d) {
          d = a.options.labelMap.snapscreen || a.getLang("labelMap.snapscreen") || "";
          var f = new b.Button({
            className: "edui-for-snapscreen",
            title: d,
            onclick: function() {
              a.execCommand("snapscreen")
            },
            theme: a.options.theme
          });
          if (b.buttons.snapscreen = f, c = c || (a.options.iframeUrlMap || {}).snapscreen || e.snapscreen) {
            var g = new b.Dialog({
              iframeUrl: a.ui.mapUrl(c),
              editor: a,
              className: "edui-for-snapscreen",
              title: d,
              buttons: [{
                className: "edui-okbutton",
                label: a.getLang("ok"),
                editor: a,
                onclick: function() {
                  g.close(!0)
                }
              },
                {
                  className: "edui-cancelbutton",
                  label: a.getLang("cancel"),
                  editor: a,
                  onclick: function() {
                    g.close(!1)
                  }
                }]
            });
            g.render(),
              a.ui._dialogs.snapscreenDialog = g
          }
          return a.addListener("selectionchange",
            function() {
              f.setDisabled(a.queryCommandState("snapscreen") == -1)
            }),
            f
        },
          b.insertcode = function(c, d, e) {
            d = c.options.insertcode || [],
              e = c.options.labelMap.insertcode || c.getLang("labelMap.insertcode") || "";
            var f = [];
            a.each(d,
              function(a, b) {
                f.push({
                  label: a,
                  value: b,
                  theme: c.options.theme,
                  renderLabelHtml: function() {
                    return '<div class="edui-label %%-label" >' + (this.label || "") + "</div>"
                  }
                })
              });
            var g = new b.Combox({
              editor: c,
              items: f,
              onselect: function(a, b) {
                c.execCommand("insertcode", this.items[b].value)
              },
              onbuttonclick: function() {
                this.showPopup()
              },
              title: e,
              initValue: e,
              className: "edui-for-insertcode",
              indexByValue: function(a) {
                if (a) for (var b, c = 0; b = this.items[c]; c++) if (b.value.indexOf(a) != -1) return c;
                return - 1
              }
            });
            return b.buttons.insertcode = g,
              c.addListener("selectionchange",
                function(a, b, d) {
                  if (!d) {
                    var f = c.queryCommandState("insertcode");
                    if (f == -1) g.setDisabled(!0);
                    else {
                      g.setDisabled(!1);
                      var h = c.queryCommandValue("insertcode");
                      if (!h) return void g.setValue(e);
                      h && (h = h.replace(/['"]/g, "").split(",")[0]),
                        g.setValue(h)
                    }
                  }
                }),
              g
          },
          b.fontfamily = function(c, d, e) {
            if (d = c.options.fontfamily || [], e = c.options.labelMap.fontfamily || c.getLang("labelMap.fontfamily") || "", d.length) {
              for (var f, g = 0,
                     h = []; f = d[g]; g++) {
                var i = c.getLang("fontfamily")[f.name] || ""; !
                  function(b, d) {
                    h.push({
                      label: b,
                      value: d,
                      theme: c.options.theme,
                      renderLabelHtml: function() {
                        return '<div class="edui-label %%-label" style="font-family:' + a.unhtml(this.value) + '">' + (this.label || "") + "</div>"
                      }
                    })
                  } (f.label || i, f.val)
              }
              var j = new b.Combox({
                editor: c,
                items: h,
                onselect: function(a, b) {
                  c.execCommand("FontFamily", this.items[b].value)
                },
                onbuttonclick: function() {
                  this.showPopup()
                },
                title: e,
                initValue: e,
                className: "edui-for-fontfamily",
                indexByValue: function(a) {
                  if (a) for (var b, c = 0; b = this.items[c]; c++) if (b.value.indexOf(a) != -1) return c;
                  return - 1
                }
              });
              return b.buttons.fontfamily = j,
                c.addListener("selectionchange",
                  function(a, b, d) {
                    if (!d) {
                      var e = c.queryCommandState("FontFamily");
                      if (e == -1) j.setDisabled(!0);
                      else {
                        j.setDisabled(!1);
                        var f = c.queryCommandValue("FontFamily");
                        f && (f = f.replace(/['"]/g, "").split(",")[0]),
                          j.setValue(f)
                      }
                    }
                  }),
                j
            }
          },
          b.fontsize = function(a, c, d) {
            if (d = a.options.labelMap.fontsize || a.getLang("labelMap.fontsize") || "", c = c || a.options.fontsize || [], c.length) {
              for (var e = [], f = 0; f < c.length; f++) {
                var g = c[f] + "px";
                e.push({
                  label: g,
                  value: g,
                  theme: a.options.theme,
                  renderLabelHtml: function() {
                    return '<div class="edui-label %%-label" style="line-height:1;font-size:' + this.value + '">' + (this.label || "") + "</div>"
                  }
                })
              }
              var h = new b.Combox({
                editor: a,
                items: e,
                title: d,
                initValue: d,
                onselect: function(b, c) {
                  a.execCommand("FontSize", this.items[c].value)
                },
                onbuttonclick: function() {
                  this.showPopup()
                },
                className: "edui-for-fontsize"
              });
              return b.buttons.fontsize = h,
                a.addListener("selectionchange",
                  function(b, c, d) {
                    if (!d) {
                      var e = a.queryCommandState("FontSize");
                      e == -1 ? h.setDisabled(!0) : (h.setDisabled(!1), h.setValue(a.queryCommandValue("FontSize")))
                    }
                  }),
                h
            }
          },
          b.paragraph = function(c, d, e) {
            if (e = c.options.labelMap.paragraph || c.getLang("labelMap.paragraph") || "", d = c.options.paragraph || [], !a.isEmptyObject(d)) {
              var f = [];
              for (var g in d) f.push({
                value: g,
                label: d[g] || c.getLang("paragraph")[g],
                theme: c.options.theme,
                renderLabelHtml: function() {
                  return '<div class="edui-label %%-label"><span class="edui-for-' + this.value + '">' + (this.label || "") + "</span></div>"
                }
              });
              var h = new b.Combox({
                editor: c,
                items: f,
                title: e,
                initValue: e,
                className: "edui-for-paragraph",
                onselect: function(a, b) {
                  c.execCommand("Paragraph", this.items[b].value)
                },
                onbuttonclick: function() {
                  this.showPopup()
                }
              });
              return b.buttons.paragraph = h,
                c.addListener("selectionchange",
                  function(a, b, d) {
                    if (!d) {
                      var e = c.queryCommandState("Paragraph");
                      if (e == -1) h.setDisabled(!0);
                      else {
                        h.setDisabled(!1);
                        var f = c.queryCommandValue("Paragraph"),
                          g = h.indexByValue(f);
                        g != -1 ? h.setValue(f) : h.setValue(h.initValue)
                      }
                    }
                  }),
                h
            }
          },
          b.customstyle = function(a) {
            var c = a.options.customstyle || [],
              d = a.options.labelMap.customstyle || a.getLang("labelMap.customstyle") || "";
            if (c.length) {
              for (var e, f = a.getLang("customstyle"), g = 0, h = []; e = c[g++];) !
                function(b) {
                  var c = {};
                  c.label = b.label ? b.label: f[b.name],
                    c.style = b.style,
                    c.className = b.className,
                    c.tag = b.tag,
                    h.push({
                      label: c.label,
                      value: c,
                      theme: a.options.theme,
                      renderLabelHtml: function() {
                        return '<div class="edui-label %%-label"><' + c.tag + " " + (c.className ? ' class="' + c.className + '"': "") + (c.style ? ' style="' + c.style + '"': "") + ">" + c.label + "</" + c.tag + "></div>"
                      }
                    })
                } (e);
              var i = new b.Combox({
                editor: a,
                items: h,
                title: d,
                initValue: d,
                className: "edui-for-customstyle",
                onselect: function(b, c) {
                  a.execCommand("customstyle", this.items[c].value)
                },
                onbuttonclick: function() {
                  this.showPopup()
                },
                indexByValue: function(a) {
                  for (var b, c = 0; b = this.items[c++];) if (b.label == a) return c - 1;
                  return - 1
                }
              });
              return b.buttons.customstyle = i,
                a.addListener("selectionchange",
                  function(b, c, d) {
                    if (!d) {
                      var e = a.queryCommandState("customstyle");
                      if (e == -1) i.setDisabled(!0);
                      else {
                        i.setDisabled(!1);
                        var f = a.queryCommandValue("customstyle"),
                          g = i.indexByValue(f);
                        g != -1 ? i.setValue(f) : i.setValue(i.initValue)
                      }
                    }
                  }),
                i
            }
          },
          b.inserttable = function(a, c, d) {
            d = a.options.labelMap.inserttable || a.getLang("labelMap.inserttable") || "";
            var e = new b.TableButton({
              editor: a,
              title: d,
              className: "edui-for-inserttable",
              onpicktable: function(b, c, d) {
                a.execCommand("InsertTable", {
                  numRows: d,
                  numCols: c,
                  border: 1
                })
              },
              onbuttonclick: function() {
                this.showPopup()
              }
            });
            return b.buttons.inserttable = e,
              a.addListener("selectionchange",
                function() {
                  e.setDisabled(a.queryCommandState("inserttable") == -1)
                }),
              e
          },
          b.lineheight = function(a) {
            var c = a.options.lineheight || [];
            if (c.length) {
              for (var d, e = 0,
                     f = []; d = c[e++];) f.push({
                label: d,
                value: d,
                theme: a.options.theme,
                onclick: function() {
                  a.execCommand("lineheight", this.value)
                }
              });
              var g = new b.MenuButton({
                editor: a,
                className: "edui-for-lineheight",
                title: a.options.labelMap.lineheight || a.getLang("labelMap.lineheight") || "",
                items: f,
                onbuttonclick: function() {
                  var b = a.queryCommandValue("LineHeight") || this.value;
                  a.execCommand("LineHeight", b)
                }
              });
              return b.buttons.lineheight = g,
                a.addListener("selectionchange",
                  function() {
                    var b = a.queryCommandState("LineHeight");
                    if (b == -1) g.setDisabled(!0);
                    else {
                      g.setDisabled(!1);
                      var c = a.queryCommandValue("LineHeight");
                      c && g.setValue((c + "").replace(/cm/, "")),
                        g.setChecked(b)
                    }
                  }),
                g
            }
          };
        for (var k, l = ["top", "bottom"], m = 0; k = l[m++];) !
          function(a) {
            b["rowspacing" + a] = function(c) {
              var d = c.options["rowspacing" + a] || [];
              if (!d.length) return null;
              for (var e, f = 0,
                     g = []; e = d[f++];) g.push({
                label: e,
                value: e,
                theme: c.options.theme,
                onclick: function() {
                  c.execCommand("rowspacing", this.value, a)
                }
              });
              var h = new b.MenuButton({
                editor: c,
                className: "edui-for-rowspacing" + a,
                title: c.options.labelMap["rowspacing" + a] || c.getLang("labelMap.rowspacing" + a) || "",
                items: g,
                onbuttonclick: function() {
                  var b = c.queryCommandValue("rowspacing", a) || this.value;
                  c.execCommand("rowspacing", b, a)
                }
              });
              return b.buttons[a] = h,
                c.addListener("selectionchange",
                  function() {
                    var b = c.queryCommandState("rowspacing", a);
                    if (b == -1) h.setDisabled(!0);
                    else {
                      h.setDisabled(!1);
                      var d = c.queryCommandValue("rowspacing", a);
                      d && h.setValue((d + "").replace(/%/, "")),
                        h.setChecked(b)
                    }
                  }),
                h
            }
          } (k);
        for (var n, o = ["insertorderedlist", "insertunorderedlist"], p = 0; n = o[p++];) !
          function(a) {
            b[a] = function(c) {
              var d = c.options[a],
                e = function() {
                  c.execCommand(a, this.value)
                },
                f = [];
              for (var g in d) f.push({
                label: d[g] || c.getLang()[a][g] || "",
                value: g,
                theme: c.options.theme,
                onclick: e
              });
              var h = new b.MenuButton({
                editor: c,
                className: "edui-for-" + a,
                title: c.getLang("labelMap." + a) || "",
                items: f,
                onbuttonclick: function() {
                  var b = c.queryCommandValue(a) || this.value;
                  c.execCommand(a, b)
                }
              });
              return b.buttons[a] = h,
                c.addListener("selectionchange",
                  function() {
                    var b = c.queryCommandState(a);
                    if (b == -1) h.setDisabled(!0);
                    else {
                      h.setDisabled(!1);
                      var d = c.queryCommandValue(a);
                      h.setValue(d),
                        h.setChecked(b)
                    }
                  }),
                h
            }
          } (n);
        b.fullscreen = function(a, c) {
          c = a.options.labelMap.fullscreen || a.getLang("labelMap.fullscreen") || "";
          var d = new b.Button({
            className: "edui-for-fullscreen",
            title: c,
            theme: a.options.theme,
            onclick: function() {
              a.ui && a.ui.setFullScreen(!a.ui.isFullScreen()),
                this.setChecked(a.ui.isFullScreen())
            }
          });
          return b.buttons.fullscreen = d,
            a.addListener("selectionchange",
              function() {
                var b = a.queryCommandState("fullscreen");
                d.setDisabled(b == -1),
                  d.setChecked(a.ui.isFullScreen())
              }),
            d
        },
          b.emotion = function(a, c) {
            var d = "emotion",
              f = new b.MultiMenuPop({
                title: a.options.labelMap[d] || a.getLang("labelMap." + d) || "",
                editor: a,
                className: "edui-for-" + d,
                iframeUrl: a.ui.mapUrl(c || (a.options.iframeUrlMap || {})[d] || e[d])
              });
            return b.buttons[d] = f,
              a.addListener("selectionchange",
                function() {
                  f.setDisabled(a.queryCommandState(d) == -1)
                }),
              f
          },
          b.autotypeset = function(a) {
            var c = new b.AutoTypeSetButton({
              editor: a,
              title: a.options.labelMap.autotypeset || a.getLang("labelMap.autotypeset") || "",
              className: "edui-for-autotypeset",
              onbuttonclick: function() {
                a.execCommand("autotypeset")
              }
            });
            return b.buttons.autotypeset = c,
              a.addListener("selectionchange",
                function() {
                  c.setDisabled(a.queryCommandState("autotypeset") == -1)
                }),
              c
          },
          b.simpleupload = function(a) {
            var c = "simpleupload",
              d = new b.Button({
                className: "edui-for-" + c,
                title: a.options.labelMap[c] || a.getLang("labelMap." + c) || "",
                onclick: function() {},
                theme: a.options.theme,
                showText: !1
              });
            return b.buttons[c] = d,
              a.addListener("ready",
                function() {
                  var b = d.getDom("body"),
                    c = b.children[0];
                  a.fireEvent("simpleuploadbtnready", c)
                }),
              a.addListener("selectionchange",
                function(b, e, f) {
                  var g = a.queryCommandState(c);
                  g == -1 ? (d.setDisabled(!0), d.setChecked(!1)) : f || (d.setDisabled(!1), d.setChecked(g))
                }),
              d
          }
      } (),
      function() {
        function a(a) {
          this.initOptions(a),
            this.initEditorUI()
        }
        var b = baidu.editor.utils,
          c = baidu.editor.ui.uiUtils,
          d = baidu.editor.ui.UIBase,
          e = baidu.editor.dom.domUtils,
          f = [];
        a.prototype = {
          uiName: "editor",
          initEditorUI: function() {
            function a(a, b) {
              a.setOpt({
                wordCount: !0,
                maximumWords: 1e4,
                wordCountMsg: a.options.wordCountMsg || a.getLang("wordCountMsg"),
                wordOverFlowMsg: a.options.wordOverFlowMsg || a.getLang("wordOverFlowMsg")
              });
              var c = a.options,
                d = c.maximumWords,
                e = c.wordCountMsg,
                f = c.wordOverFlowMsg,
                g = b.getDom("wordcount");
              if (c.wordCount) {
                var h = a.getContentLength(!0);
                h > d ? (g.innerHTML = f, a.fireEvent("wordcountoverflow")) : g.innerHTML = e.replace("{#leave}", d - h).replace("{#count}", h)
              }
            }
            this.editor.ui = this,
              this._dialogs = {},
              this.initUIBase(),
              this._initToolbars();
            var b = this.editor,
              c = this;
            b.addListener("ready",
              function() {
                function d() {
                  a(b, c),
                    e.un(b.document, "click", arguments.callee)
                }
                b.getDialog = function(a) {
                  return b.ui._dialogs[a + "Dialog"]
                },
                  e.on(b.window, "scroll",
                    function(a) {
                      baidu.editor.ui.Popup.postHide(a)
                    }),
                  b.ui._actualFrameWidth = b.options.initialFrameWidth,
                UE.browser.ie && 6 === UE.browser.version && b.container.ownerDocument.execCommand("BackgroundImageCache", !1, !0),
                b.options.elementPathEnabled && (b.ui.getDom("elementpath").innerHTML = '<div class="edui-editor-breadcrumb">' + b.getLang("elementPathTip") + ":</div>"),
                b.options.wordCount && (e.on(b.document, "click", d), b.ui.getDom("wordcount").innerHTML = b.getLang("wordCountTip")),
                  b.ui._scale(),
                  b.options.scaleEnabled ? (b.autoHeightEnabled && b.disableAutoHeight(), c.enableScale()) : c.disableScale(),
                b.options.elementPathEnabled || b.options.wordCount || b.options.scaleEnabled || (b.ui.getDom("elementpath").style.display = "none", b.ui.getDom("wordcount").style.display = "none", b.ui.getDom("scale").style.display = "none"),
                b.selection.isFocus() && b.fireEvent("selectionchange", !1, !0)
              }),
              b.addListener("mousedown",
                function(a, b) {
                  var c = b.target || b.srcElement;
                  baidu.editor.ui.Popup.postHide(b, c),
                    baidu.editor.ui.ShortCutMenu.postHide(b)
                }),
              b.addListener("delcells",
                function() {
                  UE.ui.edittip && new UE.ui.edittip(b),
                    b.getDialog("edittip").open()
                });
            var d, f, g = !1;
            b.addListener("afterpaste",
              function() {
                b.queryCommandState("pasteplain") || (baidu.editor.ui.PastePicker && (d = new baidu.editor.ui.Popup({
                  content: new baidu.editor.ui.PastePicker({
                    editor: b
                  }),
                  editor: b,
                  className: "edui-wordpastepop"
                }), d.render()), g = !0)
              }),
              b.addListener("afterinserthtml",
                function() {
                  clearTimeout(f),
                    f = setTimeout(function() {
                        if (d && (g || b.ui._isTransfer)) {
                          if (d.isHidden()) {
                            var a = e.createElement(b.document, "span", {
                                style: "line-height:0px;",
                                innerHTML: "\ufeff"
                              }),
                              c = b.selection.getRange();
                            c.insertNode(a);
                            var f = getDomNode(a, "firstChild", "previousSibling");
                            f && d.showAnchor(3 == f.nodeType ? f.parentNode: f),
                              e.remove(a)
                          } else d.show();
                          delete b.ui._isTransfer,
                            g = !1
                        }
                      },
                      200)
                }),
              b.addListener("contextmenu",
                function(a, b) {
                  baidu.editor.ui.Popup.postHide(b)
                }),
              b.addListener("keydown",
                function(a, b) {
                  d && d.dispose(b);
                  var c = b.keyCode || b.which;
                  b.altKey && 90 == c && UE.ui.buttons.fullscreen.onclick()
                }),
              b.addListener("wordcount",
                function(b) {
                  a(this, c)
                }),
              b.addListener("selectionchange",
                function() {
                  b.options.elementPathEnabled && c[(b.queryCommandState("elementpath") == -1 ? "dis": "en") + "ableElementPath"](),
                  b.options.scaleEnabled && c[(b.queryCommandState("scale") == -1 ? "dis": "en") + "ableScale"]()
                });
            var h = new baidu.editor.ui.Popup({
              editor: b,
              content: "",
              className: "edui-bubble",
              _onEditButtonClick: function() {
                this.hide(),
                  b.ui._dialogs.linkDialog.open()
              },
              _onImgEditButtonClick: function(a) {
                this.hide(),
                b.ui._dialogs[a] && b.ui._dialogs[a].open()
              },
              _onImgSetFloat: function(a) {
                this.hide(),
                  b.execCommand("imagefloat", a)
              },
              _setIframeAlign: function(a) {
                var b = h.anchorEl,
                  c = b.cloneNode(!0);
                switch (a) {
                  case - 2 : c.setAttribute("align", "");
                    break;
                  case - 1 : c.setAttribute("align", "left");
                    break;
                  case 1:
                    c.setAttribute("align", "right")
                }
                b.parentNode.insertBefore(c, b),
                  e.remove(b),
                  h.anchorEl = c,
                  h.showAnchor(h.anchorEl)
              },
              _updateIframe: function() {
                var a = b._iframe = h.anchorEl;
                e.hasClass(a, "ueditor_baidumap") ? (b.selection.getRange().selectNode(a).select(), b.ui._dialogs.mapDialog.open(), h.hide()) : (b.ui._dialogs.insertframeDialog.open(), h.hide())
              },
              _onRemoveButtonClick: function(a) {
                b.execCommand(a),
                  this.hide()
              },
              queryAutoHide: function(a) {
                return a && a.ownerDocument == b.document && ("img" == a.tagName.toLowerCase() || e.findParentByTagName(a, "a", !0)) ? a !== h.anchorEl: baidu.editor.ui.Popup.prototype.queryAutoHide.call(this, a)
              }
            });
            h.render(),
            b.options.imagePopup && (b.addListener("mouseover",
              function(a, c) {
                c = c || window.event;
                var d = c.target || c.srcElement;
                if (b.ui._dialogs.insertframeDialog && /iframe/gi.test(d.tagName)) {
                  var e = h.formatHtml("<nobr>" + b.getLang("property") + ': <span onclick=$$._setIframeAlign(-2) class="edui-clickable">' + b.getLang("default") + '</span>&nbsp;&nbsp;<span onclick=$$._setIframeAlign(-1) class="edui-clickable">' + b.getLang("justifyleft") + '</span>&nbsp;&nbsp;<span onclick=$$._setIframeAlign(1) class="edui-clickable">' + b.getLang("justifyright") + '</span>&nbsp;&nbsp; <span onclick="$$._updateIframe( this);" class="edui-clickable">' + b.getLang("modify") + "</span></nobr>");
                  e ? (h.getDom("content").innerHTML = e, h.anchorEl = d, h.showAnchor(h.anchorEl)) : h.hide()
                }
              }), b.addListener("selectionchange",
              function(a, c) {
                if (c) {
                  var d = "",
                    f = "",
                    g = b.selection.getRange().getClosedNode(),
                    i = b.ui._dialogs;
                  if (g && "IMG" == g.tagName) {
                    var j = "insertimageDialog";
                    if (g.className.indexOf("edui-faked-video") == -1 && g.className.indexOf("edui-upload-video") == -1 || (j = "insertvideoDialog"), g.className.indexOf("edui-faked-webapp") != -1 && (j = "webappDialog"), g.src.indexOf("http://api.map.baidu.com") != -1 && (j = "mapDialog"), g.className.indexOf("edui-faked-music") != -1 && (j = "musicDialog"), g.src.indexOf("http://maps.google.com/maps/api/staticmap") != -1 && (j = "gmapDialog"), g.getAttribute("anchorname") && (j = "anchorDialog", d = h.formatHtml("<nobr>" + b.getLang("property") + ': <span onclick=$$._onImgEditButtonClick("anchorDialog") class="edui-clickable">' + b.getLang("modify") + "</span>&nbsp;&nbsp;<span onclick=$$._onRemoveButtonClick('anchor') class=\"edui-clickable\">" + b.getLang("delete") + "</span></nobr>")), g.getAttribute("word_img") && (b.word_img = [g.getAttribute("word_img")], j = "wordimageDialog"), (e.hasClass(g, "loadingclass") || e.hasClass(g, "loaderrorclass")) && (j = ""), !i[j]) return;
                    f = "<nobr>" + b.getLang("property") + ': <span onclick=$$._onImgSetFloat("none") class="edui-clickable">' + b.getLang("default") + '</span>&nbsp;&nbsp;<span onclick=$$._onImgSetFloat("left") class="edui-clickable">' + b.getLang("justifyleft") + '</span>&nbsp;&nbsp;<span onclick=$$._onImgSetFloat("right") class="edui-clickable">' + b.getLang("justifyright") + '</span>&nbsp;&nbsp;<span onclick=$$._onImgSetFloat("center") class="edui-clickable">' + b.getLang("justifycenter") + "</span>&nbsp;&nbsp;<span onclick=\"$$._onImgEditButtonClick('" + j + '\');" class="edui-clickable">' + b.getLang("modify") + "</span></nobr>",
                    !d && (d = h.formatHtml(f))
                  }
                  if (b.ui._dialogs.linkDialog) {
                    var k, l = b.queryCommandValue("link");
                    if (l && (k = l.getAttribute("_href") || l.getAttribute("href", 2))) {
                      var m = k;
                      k.length > 30 && (m = k.substring(0, 20) + "..."),
                      d && (d += '<div style="height:5px;"></div>'),
                        d += h.formatHtml("<nobr>" + b.getLang("anthorMsg") + ': <a target="_blank" href="' + k + '" title="' + k + '" >' + m + '</a> <span class="edui-clickable" onclick="$$._onEditButtonClick();">' + b.getLang("modify") + '</span> <span class="edui-clickable" onclick="$$._onRemoveButtonClick(\'unlink\');"> ' + b.getLang("clear") + "</span></nobr>"),
                        h.showAnchor(l)
                    }
                  }
                  d ? (h.getDom("content").innerHTML = d, h.anchorEl = g || l, h.showAnchor(h.anchorEl)) : h.hide()
                }
              }))
          },
          _initToolbars: function() {
            for (var a = this.editor,
                   c = this.toolbars || [], d = [], e = 0; e < c.length; e++) {
              for (var f = c[e], g = new baidu.editor.ui.Toolbar({
                theme: a.options.theme
              }), h = 0; h < f.length; h++) {
                var i = f[h],
                  j = null;
                if ("string" == typeof i) {
                  if (i = i.toLowerCase(), "|" == i && (i = "Separator"), "||" == i && (i = "Breakline"), baidu.editor.ui[i] && (j = new baidu.editor.ui[i](a)), "fullscreen" == i) {
                    d && d[0] ? d[0].items.splice(0, 0, j) : j && g.items.splice(0, 0, j);
                    continue
                  }
                } else j = i;
                j && j.id && g.add(j)
              }
              d[e] = g
            }
            b.each(UE._customizeUI,
              function(b, c) {
                var d, e;
                return (!b.id || b.id == a.key) && (d = b.execFn.call(a, a, c), void(d && (e = b.index, void 0 === e && (e = g.items.length), g.add(d, e))))
              }),
              this.toolbars = d
          },
          getHtmlTpl: function() {
            return '<div id="##" class="%%"><div id="##_toolbarbox" class="%%-toolbarbox">' + (this.toolbars.length ? '<div id="##_toolbarboxouter" class="%%-toolbarboxouter"><div class="%%-toolbarboxinner">' + this.renderToolbarBoxHtml() + "</div></div>": "") + '<div id="##_toolbarmsg" class="%%-toolbarmsg" style="display:none;"><div id = "##_upload_dialog" class="%%-toolbarmsg-upload" onclick="$$.showWordImageDialog();">' + this.editor.getLang("clickToUpload") + '</div><div class="%%-toolbarmsg-close" onclick="$$.hideToolbarMsg();">x</div><div id="##_toolbarmsg_label" class="%%-toolbarmsg-label"></div><div style="height:0;overflow:hidden;clear:both;"></div></div><div id="##_message_holder" class="%%-messageholder"></div></div><div id="##_iframeholder" class="%%-iframeholder"></div><div id="##_bottombar" class="%%-bottomContainer"><table><tr><td id="##_elementpath" class="%%-bottombar"></td><td id="##_wordcount" class="%%-wordcount"></td><td id="##_scale" class="%%-scale"><div class="%%-icon"></div></td></tr></table></div><div id="##_scalelayer"></div></div>'
          },
          showWordImageDialog: function() {
            this._dialogs.wordimageDialog.open()
          },
          renderToolbarBoxHtml: function() {
            for (var a = [], b = 0; b < this.toolbars.length; b++) a.push(this.toolbars[b].renderHtml());
            return a.join("")
          },
          setFullScreen: function(a) {
            var b = this.editor,
              c = b.container.parentNode.parentNode;
            if (this._fullscreen != a) {
              if (this._fullscreen = a, this.editor.fireEvent("beforefullscreenchange", a), baidu.editor.browser.gecko) var d = b.selection.getRange().createBookmark();
              if (a) {
                for (;
                  "BODY" != c.tagName;) {
                  var e = baidu.editor.dom.domUtils.getComputedStyle(c, "position");
                  f.push(e),
                    c.style.position = "static",
                    c = c.parentNode
                }
                this._bakHtmlOverflow = document.documentElement.style.overflow,
                  this._bakBodyOverflow = document.body.style.overflow,
                  this._bakAutoHeight = this.editor.autoHeightEnabled,
                  this._bakScrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop),
                  this._bakEditorContaninerWidth = b.iframe.parentNode.offsetWidth,
                this._bakAutoHeight && (b.autoHeightEnabled = !1, this.editor.disableAutoHeight()),
                  document.documentElement.style.overflow = "hidden",
                  window.scrollTo(0, window.scrollY),
                  this._bakCssText = this.getDom().style.cssText,
                  this._bakCssText1 = this.getDom("iframeholder").style.cssText,
                  b.iframe.parentNode.style.width = "",
                  this._updateFullScreen()
              } else {
                for (;
                  "BODY" != c.tagName;) c.style.position = f.shift(),
                  c = c.parentNode;
                this.getDom().style.cssText = this._bakCssText,
                  this.getDom("iframeholder").style.cssText = this._bakCssText1,
                this._bakAutoHeight && (b.autoHeightEnabled = !0, this.editor.enableAutoHeight()),
                  document.documentElement.style.overflow = this._bakHtmlOverflow,
                  document.body.style.overflow = this._bakBodyOverflow,
                  b.iframe.parentNode.style.width = this._bakEditorContaninerWidth + "px",
                  window.scrollTo(0, this._bakScrollTop)
              }
              if (browser.gecko && "true" === b.body.contentEditable) {
                var g = document.createElement("input");
                document.body.appendChild(g),
                  b.body.contentEditable = !1,
                  setTimeout(function() {
                      g.focus(),
                        setTimeout(function() {
                            b.body.contentEditable = !0,
                              b.fireEvent("fullscreenchanged", a),
                              b.selection.getRange().moveToBookmark(d).select(!0),
                              baidu.editor.dom.domUtils.remove(g),
                            a && window.scroll(0, 0)
                          },
                          0)
                    },
                    0)
              }
              "true" === b.body.contentEditable && (this.editor.fireEvent("fullscreenchanged", a), this.triggerLayout())
            }
          },
          _updateFullScreen: function() {
            if (this._fullscreen) {
              var a = c.getViewportRect();
              if (this.getDom().style.cssText = "border:0;position:absolute;left:0;top:" + (this.editor.options.topOffset || 0) + "px;width:" + a.width + "px;height:" + a.height + "px;z-index:" + (1 * this.getDom().style.zIndex + 100), c.setViewportOffset(this.getDom(), {
                left: 0,
                top: this.editor.options.topOffset || 0
              }), this.editor.setHeight(a.height - this.getDom("toolbarbox").offsetHeight - this.getDom("bottombar").offsetHeight - (this.editor.options.topOffset || 0), !0), browser.gecko) try {
                window.onresize()
              } catch(b) {}
            }
          },
          _updateElementPath: function() {
            var a, b = this.getDom("elementpath");
            if (this.elementPathEnabled && (a = this.editor.queryCommandValue("elementpath"))) {
              for (var c, d = [], e = 0; c = a[e]; e++) d[e] = this.formatHtml('<span unselectable="on" onclick="$$.editor.execCommand(&quot;elementpath&quot;, &quot;' + e + '&quot;);">' + c + "</span>");
              b.innerHTML = '<div class="edui-editor-breadcrumb" onmousedown="return false;">' + this.editor.getLang("elementPathTip") + ": " + d.join(" &gt; ") + "</div>"
            } else b.style.display = "none"
          },
          disableElementPath: function() {
            var a = this.getDom("elementpath");
            a.innerHTML = "",
              a.style.display = "none",
              this.elementPathEnabled = !1
          },
          enableElementPath: function() {
            var a = this.getDom("elementpath");
            a.style.display = "",
              this.elementPathEnabled = !0,
              this._updateElementPath()
          },
          _scale: function() {
            function a() {
              o = e.getXY(h),
              p || (p = g.options.minFrameHeight + j.offsetHeight + k.offsetHeight),
                m.style.cssText = "position:absolute;left:0;display:;top:0;background-color:#41ABFF;opacity:0.4;filter: Alpha(opacity=40);width:" + h.offsetWidth + "px;height:" + h.offsetHeight + "px;z-index:" + (g.options.zIndex + 1),
                e.on(f, "mousemove", b),
                e.on(i, "mouseup", c),
                e.on(f, "mouseup", c)
            }
            function b(a) {
              d();
              var b = a || window.event;
              r = b.pageX || f.documentElement.scrollLeft + b.clientX,
                s = b.pageY || f.documentElement.scrollTop + b.clientY,
                t = r - o.x,
                u = s - o.y,
              t >= q && (n = !0, m.style.width = t + "px"),
              u >= p && (n = !0, m.style.height = u + "px")
            }
            function c() {
              n && (n = !1, g.ui._actualFrameWidth = m.offsetWidth - 2, h.style.width = g.ui._actualFrameWidth + "px", g.setHeight(m.offsetHeight - k.offsetHeight - j.offsetHeight - 2, !0)),
              m && (m.style.display = "none"),
                d(),
                e.un(f, "mousemove", b),
                e.un(i, "mouseup", c),
                e.un(f, "mouseup", c)
            }
            function d() {
              browser.ie ? f.selection.clear() : window.getSelection().removeAllRanges()
            }
            var f = document,
              g = this.editor,
              h = g.container,
              i = g.document,
              j = this.getDom("toolbarbox"),
              k = this.getDom("bottombar"),
              l = this.getDom("scale"),
              m = this.getDom("scalelayer"),
              n = !1,
              o = null,
              p = 0,
              q = g.options.minFrameWidth,
              r = 0,
              s = 0,
              t = 0,
              u = 0,
              v = this;
            this.editor.addListener("fullscreenchanged",
              function(a, b) {
                if (b) v.disableScale();
                else if (v.editor.options.scaleEnabled) {
                  v.enableScale();
                  var c = v.editor.document.createElement("span");
                  v.editor.body.appendChild(c),
                    v.editor.body.style.height = Math.max(e.getXY(c).y, v.editor.iframe.offsetHeight - 20) + "px",
                    e.remove(c)
                }
              }),
              this.enableScale = function() {
                1 != g.queryCommandState("source") && (l.style.display = "", this.scaleEnabled = !0, e.on(l, "mousedown", a))
              },
              this.disableScale = function() {
                l.style.display = "none",
                  this.scaleEnabled = !1,
                  e.un(l, "mousedown", a)
              }
          },
          isFullScreen: function() {
            return this._fullscreen
          },
          postRender: function() {
            d.prototype.postRender.call(this);
            for (var a = 0; a < this.toolbars.length; a++) this.toolbars[a].postRender();
            var b, c = this,
              e = baidu.editor.dom.domUtils,
              f = function() {
                clearTimeout(b),
                  b = setTimeout(function() {
                    c._updateFullScreen()
                  })
              };
            e.on(window, "resize", f),
              c.addListener("destroy",
                function() {
                  e.un(window, "resize", f),
                    clearTimeout(b)
                })
          },
          showToolbarMsg: function(a, b) {
            if (this.getDom("toolbarmsg_label").innerHTML = a, this.getDom("toolbarmsg").style.display = "", !b) {
              var c = this.getDom("upload_dialog");
              c.style.display = "none"
            }
          },
          hideToolbarMsg: function() {
            this.getDom("toolbarmsg").style.display = "none"
          },
          mapUrl: function(a) {
            return a ? a.replace("~/", this.editor.options.UEDITOR_HOME_URL || "") : ""
          },
          triggerLayout: function() {
            var a = this.getDom();
            "1" == a.style.zoom ? a.style.zoom = "100%": a.style.zoom = "1"
          }
        },
          b.inherits(a, baidu.editor.ui.UIBase);
        var g = {};
        UE.ui.Editor = function(c) {
          var d = new UE.Editor(c);
          d.options.editor = d,
            b.loadFile(document, {
              href: d.options.themePath + d.options.theme + "/css/ueditor.css",
              tag: "link",
              type: "text/css",
              rel: "stylesheet"
            });
          var f = d.render;
          return d.render = function(c) {
            c.constructor === String && (d.key = c, g[c] = d),
              b.domReady(function() {
                function b() {
                  if (d.setOpt({
                    labelMap: d.options.labelMap || d.getLang("labelMap")
                  }), new a(d.options), c && (c.constructor === String && (c = document.getElementById(c)), c && c.getAttribute("name") && (d.options.textarea = c.getAttribute("name")), c && /script|textarea/gi.test(c.tagName))) {
                    var b = document.createElement("div");
                    c.parentNode.insertBefore(b, c);
                    var g = c.value || c.innerHTML;
                    d.options.initialContent = /^[\t\r\n ]*$/.test(g) ? d.options.initialContent: g.replace(/>[\n\r\t]+([ ]{4})+/g, ">").replace(/[\n\r\t]+([ ]{4})+</g, "<").replace(/>[\n\r\t]+</g, "><"),
                    c.className && (b.className = c.className),
                    c.style.cssText && (b.style.cssText = c.style.cssText),
                      /textarea/i.test(c.tagName) ? (d.textarea = c, d.textarea.style.display = "none") : c.parentNode.removeChild(c),
                    c.id && (b.id = c.id, e.removeAttributes(c, "id")),
                      c = b,
                      c.innerHTML = ""
                  }
                  e.addClass(c, "edui-" + d.options.theme),
                    d.ui.render(c);
                  var h = d.options;
                  d.container = d.ui.getDom();
                  for (var i, j = e.findParents(c, !0), k = [], l = 0; i = j[l]; l++) k[l] = i.style.display,
                    i.style.display = "block";
                  if (h.initialFrameWidth) h.minFrameWidth = h.initialFrameWidth;
                  else {
                    h.minFrameWidth = h.initialFrameWidth = c.offsetWidth;
                    var m = c.style.width;
                    /%$/.test(m) && (h.initialFrameWidth = m)
                  }
                  h.initialFrameHeight ? h.minFrameHeight = h.initialFrameHeight: h.initialFrameHeight = h.minFrameHeight = c.offsetHeight;
                  for (var i, l = 0; i = j[l]; l++) i.style.display = k[l];
                  c.style.height && (c.style.height = ""),
                    d.container.style.width = h.initialFrameWidth + (/%$/.test(h.initialFrameWidth) ? "": "px"),
                    d.container.style.zIndex = h.zIndex,
                    f.call(d, d.ui.getDom("iframeholder")),
                    d.fireEvent("afteruiready")
                }
                d.langIsReady ? b() : d.addListener("langReady", b)
              })
          },
            d
        },
          UE.getEditor = function(a, b) {
            var c = g[a];
            return c || (c = g[a] = new UE.ui.Editor(b), c.render(a)),
              c
          },
          UE.delEditor = function(a) {
            var b; (b = g[a]) && (b.key && b.destroy(), delete g[a])
          },
          UE.registerUI = function(a, c, d, e) {
            b.each(a.split(/\s+/),
              function(a) {
                UE._customizeUI[a] = {
                  id: e,
                  execFn: c,
                  index: d
                }
              })
          }
      } (),
      UE.registerUI("message",
        function(a) {
          function b() {
            var a = g.ui.getDom("toolbarbox");
            a && (c.style.top = a.offsetHeight + 3 + "px"),
              c.style.zIndex = Math.max(g.options.zIndex, g.iframe.style.zIndex) + 1
          }
          var c, d = baidu.editor.ui,
            e = d.Message,
            f = [],
            g = a;
          g.addListener("ready",
            function() {
              c = document.getElementById(g.ui.id + "_message_holder"),
                b(),
                setTimeout(function() {
                    b()
                  },
                  500)
            }),
            g.addListener("showmessage",
              function(a, d) {
                d = utils.isString(d) ? {
                  content: d
                }: d;
                var h = new e({
                    timeout: d.timeout,
                    type: d.type,
                    content: d.content,
                    keepshow: d.keepshow,
                    editor: g
                  }),
                  i = d.id || "msg_" + ( + new Date).toString(36);
                return h.render(c),
                  f[i] = h,
                  h.reset(d),
                  b(),
                  i
              }),
            g.addListener("updatemessage",
              function(a, b, d) {
                d = utils.isString(d) ? {
                  content: d
                }: d;
                var e = f[b];
                e.render(c),
                e && e.reset(d)
              }),
            g.addListener("hidemessage",
              function(a, b) {
                var c = f[b];
                c && c.hide()
              })
        }),
      UE.registerUI("autosave",
        function(a) {
          var b = null,
            c = null;
          a.on("afterautosave",
            function() {
              clearTimeout(b),
                b = setTimeout(function() {
                    c && a.trigger("hidemessage", c),
                      c = a.trigger("showmessage", {
                        content: a.getLang("autosave.success"),
                        timeout: 2e3
                      })
                  },
                  2e3)
            })
        })
  } ();
